Mybatis 二級快取的使用
阿新 • • 發佈:2020-07-13
Mybatis二級快取
- 簡介:二級快取是namesace級別的,多個SqlSession去操作同個namespace下的Mapper的sql語句,多個SqlSession可以共用二級快取,如果兩個mapper的namespace相同,(既使是兩個mapper,那麼這兩個mapper中執行sql查詢的資料也將存在相同的二級快取區域中,但是最後是每個Mapper單獨的名稱空間)
- 基於PerpetualCache的HashMap本地快取,可自定義儲存源,如Ehcacche/Redis等
- 預設是沒有開啟二級快取
- 操作流程:第一次呼叫某個namespacce下的SQL去查詢資訊,查詢到的資訊會存放該mapper對應的二級快取區域。第二次呼叫同個namespace下的mapper對映檔案中,相同的sql去查詢資訊,會去對應的二級快取內取結果
失效策略
執行同個namespace下的mapper對映檔案中增刪改sql,並執行了commit操作,會清空該二級快取
注意:實現二級快取的時候,Mybatis建議返回的POJO是可序列化的,也就是建議實現Serializable介面
快取淘汰策略:會使用預設的LRU演算法來收回(最近最少使用的)
開啟快取
如何開啟某個二級快取mapper.xml裡面配置
<!--開啟Mapper的namespace下的二級快取--> <!-- eviction:代表的是快取回收策略,常見下面兩種 1)、LRU,最近最少使用的,移除最長時間不用的物件 2)、FIFO,先進先出,按物件進入快取的順序來移除他們 flushInterval:重新整理間隔時間,單位為毫秒,這裡配置的是10秒,如果不配置他,當SQL被執行的時候才會去重新整理快取 size:引入數目,代表快取最多可以儲存多少個物件,設定過大會導致記憶體溢位 readOnly:只讀,快取資料只能讀取不能修改,預設值為false--> <cache eviction="LRU" flushInterval="100000" readOnly="true" size="1024"></cache>
全域性配置
<!--全域性配置--> <settings> <!--這個配置使全域性的對映器(二級快取)啟用或禁用快取,全域性總開關,這裡關閉,mapper中開啟了也沒用--> <setting name="cacheEnabled" value="true"/> </settings>
一級快取和二級快取使用順序
優先查詢二級快取==》查詢一級快取==》資料庫
控制某個方法不走二級快取
在標籤中新增 useCache="false"
<select id="queryUserOrder" resultMap="UserOrderResultMap" useCache="false"> select u.id, u.name, u.pwd, u.phone, u.head_img, v.id idv, v.out_trade_no, v.create_time, v.state, v.total_fee, v.video_id, v.video_title, v.video_img from user u left join video_order v on u.id = v.user_id </select>