Mybatis——快取機制
工作、學習筆記
MyBatis 包含一個非常強大的查詢快取特性,它可以非常方便地配置和定製。快取可以極大的提升查詢效率。
- MyBatis系統中預設定義了兩級快取。
- 一級快取和二級快取。
1、預設情況下,只有一級快取(SqlSession級別的快取,也稱為本地快取)開啟。
2、二級快取需要手動開啟和配置,他是基於namespace級別的快取。
3、為了提高擴充套件性。MyBatis定義了快取介面Cache。我們可以通過實現Cache介面來自定義二級快取
一、一級快取
一級快取(local cache), 即本地快取, 作用域預設為sqlSession。當 Session flush 或 close 後, 該Session 中的所有 Cache 將被清空。本地快取不能被關閉, 但可以呼叫clearCache(清空本地快取, 或者改變快取的作用域.在mybatis3.1之後, 可以配置本地快取的作用域.在 mybatis.xml 中配置
localCacheScope | MyBatis 利用本地快取機制(Local Cache)防止迴圈引用(circular references)和加速重複巢狀查詢。 預設值為 SESSION,這種情況下會快取一個會話中執行的所有查詢。 若設定值為 STATEMENT,本地會話僅用在語句執行上,對相同 SqlSession 的不同調用將不會共享資料。 |
二、一級快取演示&失效情況
同一次會話期間只要查詢過的資料都會儲存在當前SqlSession的一個Map中
- key:hashCode+查詢的SqlId+編寫的sql查詢語句+引數
- 一級快取失效的四種情況
1、不同的SqlSession對應不同的一級快取
2、同一個SqlSession但是查詢條件不同
3、同一個SqlSession兩次查詢期間執行了任何一次增刪改操作
4、同一個SqlSession兩次查詢期間手動清空了快取
三、二級快取
- 二級快取(second level cache),全域性作用域快取;二級快取預設不開啟,需要手動配置
- MyBatis提供二級快取的介面以及實現,快取實現要求 POJO實現Serializable介面
- 二級快取在 SqlSession 關閉或提交之後才會生效
使用步驟
- 全域性配置檔案中開啟二級快取
- 需要使用二級快取的對映檔案處使用cache配置快取
- 注意:POJO需要實現Serializable介面
四、快取相關屬性
<cache eviction="FIFO" flushInterval="60000" readOnly="false" size="1024"></cache>
1、eviction=“FIFO”:快取回收策略:• 預設的是 LRU。
- LRU – 最近最少使用的:移除最長時間不被使用的物件。
- FIFO – 先進先出:按物件進入快取的順序來移除它們。
- SOFT – 軟引用:移除基於垃圾回收器狀態和軟引用規則的物件。
- WEAK – 弱引用:更積極地移除基於垃圾收集器狀態和弱引用規則的物件。
2、flushInterval:重新整理間隔,單位毫秒
- 預設情況是不設定,也就是沒有重新整理間隔,快取僅僅呼叫語句時重新整理
3、size:引用數目,正整數
- 代表快取最多可以儲存多少個物件,太大容易導致記憶體溢位
4、readOnly:只讀,true/false
- true:只讀快取;會給所有呼叫者返回快取物件的相同例項。因此這些物件不能被修改。這提供了很重要的效能優勢。
- false:讀寫快取;會返回快取物件的拷貝(通過序列化)。這會慢一些,但是安全,因此預設是 false。
五、快取有關設定
1、全域性setting的cacheEnable:
- 配置二級快取的開關。一級快取一直是開啟的。
2、select標籤的useCache屬性:
- 配置這個select是否使用二級快取。一級快取一直是使用的
3、sql標籤的flushCache屬性:
- 增刪改預設flushCache=true。sql執行以後,會同時清空一級和二級快取。
- 查詢預設flushCache=false。
4、sqlSession.clearCache():
- 只是用來清除一級快取。
5、當在某一個作用域 (一級快取Session/二級快取Namespaces) 進行了 C/U/D 操作後,預設該作用域下所有 select 中的快取將被clear。
六、第三方快取整合
- EhCache 是一個純Java的程序內快取框架,具有快速、精幹等特點,是Hibernate中預設的CacheProvider。
- MyBatis定義了Cache介面方便我們進行自定義擴充套件。
- 步驟:
1、匯入ehcache包,以及整合包,日誌包
ehcache-core-2.6.8.jar、mybatis-ehcache-1.0.3.jar slf4j-api-1.6.1.jar、slf4j-log4j12-1.6.2.jar
2、編寫ehcache.xml配置檔案
3、配置cache標籤
<cache type="org.mybatis.caches.ehcache.EhcacheCache"></cache>
- 參照快取:若想在名稱空間中共享相同的快取配置和例項。可以使用 cache-ref 元素來引用另外一個快取。