1. 程式人生 > 實用技巧 >Mybatis 二級快取的使用

Mybatis 二級快取的使用

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>