MyBatis 內置了一個強大的事務性查詢緩存機制,包括一級緩存,二級緩存,它可以非常方便地配置和定製。一級緩存是sqlSession級別的緩存,二級緩存是Mapper 命名空間級別的緩存。
MyBatis 默認是開啓一級緩存的,即同一個 sqlSession 每次查詢都會先去緩存中查詢,沒有數據的話,再去數據庫獲取數據。
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.0</version>
</dependency>
它的默認配置就是啓用二級緩存的,所以這個不用我們操心。因爲Mybatis二級緩存是基於mapper級別的,所以還需要在各個Mapper 命名空間中進行進一步設置。
1)對於sql語句存在於mapper.xml上時,在mapper中開啓二級緩存需要在mapper.xml文件裏添加二級緩存的屬性配置:
<cache />
加上這個標籤,二級緩存就會啓用,它的默認屬性如下:
1、映射語句文件中的所有 select 語句將會被緩存。
2、映射語句文件中的所有 insert,update 和 delete 語句會刷新緩存。
3、緩存會使用 Least Recently Used(LRU,最近最少使用的)算法來收回。
4、根據時間表(比如 no Flush Interval,沒有刷新間隔), 緩存不會以任何時間順序來刷新。
5、緩存會存儲列表集合或對象(無論查詢方法返回什麼)的 1024 個引用。
6、緩存會被視爲是 read/write(可讀/可寫)的緩存,意味着對象檢索不是共享的,而且可以安全地被調用者修改,而不干擾其他調用者或線程所做的潛在修改。
可用的清除策略有:
- LRU – 最近最少使用:移除最長時間不被使用的對象。
- FIFO – 先進先出:按對象進入緩存的順序來移除它們。
- SOFT – 軟引用:基於垃圾回收器狀態和軟引用規則移除對象。
- WEAK – 弱引用:更積極地基於垃圾收集器狀態和弱引用規則移除對象。
默認的清除策略是 LRU。
2)對於sql語句存在與接口註解中,需要在該接口類中添加如下註解:
@CacheNamespace
命中緩存後會提示:
Cache hit ratio ...
另外,Mapper中的數據表類也需要實現序列化。
注意:
使用二級緩存時,sql語句的映射要麼全xml格式表示,要麼註解表示,二選一,不然可能會出現無法利用二級緩存或二級緩存沒有及時清空的bug問題。