1. 程式人生 > >MyBatis學習總結(八)---快取機制

MyBatis學習總結(八)---快取機制

mybatis提供了快取機制減輕資料庫壓力,提高資料庫效能

mybatis的快取分為兩級:一級快取、二級快取

一級快取是SqlSession級別的快取,快取的資料只在SqlSession內有效

二級快取是mapper級別的快取,同一個namespace公用這一個快取,所以對SqlSession是共享的

一級快取:

  mybatis的一級快取是SqlSession級別的快取,在操作資料庫的時候需要先建立SqlSession會話物件,在物件中有一個HashMap用於儲存快取資料,此HashMap是當前會話物件私有的,別的SqlSession會話物件無法訪問。

  

 

  具體流程:

      1.第一次執行select完畢會將查到的資料寫入SqlSession內的HashMap中快取起來

      2.第二次執行select會從快取中查資料,如果select相同切傳引數一樣,那麼就能從快取中返回資料,不用去資料庫了,從而提高了效率

  注意事項:

      1.如果SqlSession執行了DML操作(insert、update、delete),並commit了,那麼mybatis就會清空當前SqlSession快取中的所有快取資料,這樣可以保證快取中的存的資料永遠和資料庫中一致,避免出現髒讀

      2.當一個SqlSession結束後那麼他裡面的一級快取也就不存在了,mybatis預設是開啟一級快取,不需要配置

      3.mybatis的快取是基於[namespace:sql語句:引數]來進行快取的,意思就是,SqlSession的HashMap儲存快取資料時,是使用[namespace:sql:引數]作為key,查詢返回的語句作為value儲存的。例如:-1242243203:1146242777:winclpt.bean.userMapper.getUser:0:2147483647:select * from user where id=?:19

 

二級快取:

  二級快取是mapper級別的快取,也就是同一個namespace的mappe.xml,當多個SqlSession使用同一個Mapper操作資料庫的時候,得到的資料會快取在同一個二級快取區域

  二級快取預設是沒有開啟的。需要在setting全域性引數中配置開啟二級快取

  conf.xml:

<settings>
        <setting name="cacheEnabled" value="true"/>預設是false:關閉二級快取
<settings>

  在userMapper.xml中配置:

<cache eviction="LRU" flushInterval="60000" size="512" readOnly="true"/>當前mapper下所有語句開啟二級快取

  這裡配置了一個LRU快取,並每隔60秒重新整理,最大儲存512個物件,而卻返回的物件是隻讀的

  若想禁用當前select語句的二級快取,新增useCache="false"修改如下:

<select id="getCountByName" parameterType="java.util.Map" resultType="INTEGER" statementType="CALLABLE" useCache="false">

  具體流程:

      1.當一個sqlseesion執行了一次select後,在關閉此session的時候,會將查詢結果快取到二級快取

      2.當另一個sqlsession執行select時,首先會在他自己的一級快取中找,如果沒找到,就回去二級快取中找,找到了就返回,就不用去資料庫了,從而減少了資料庫壓力提高了效能 

  注意事項:

      1.如果SqlSession執行了DML操作(insert、update、delete),並commit了,那麼mybatis就會清空當前mapper快取中的所有快取資料,這樣可以保證快取中的存的資料永遠和資料庫中一致,避免出現髒讀

      2.mybatis的快取是基於[namespace:sql語句:引數]來進行快取的,意思就是,SqlSession的HashMap儲存快取資料時,是使用[namespace:sql:引數]作為key,查詢返回的語句作為value儲存的。例如:-1242243203:1146242777:winclpt.bean.userMapper.getUser:0:2147483647:select * from user where id=?:19