1. 程式人生 > >Mybatis——快取機制

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兩次查詢期間手動清空了快取

三、二級快取 

  1. 二級快取(second level cache),全域性作用域快取;二級快取預設不開啟,需要手動配置
  2. MyBatis提供二級快取的介面以及實現,快取實現要求 POJO實現Serializable介面
  3. 二級快取在 SqlSession 關閉或提交之後才會生效

使用步驟

  1. 全域性配置檔案中開啟二級快取
  2. 需要使用二級快取的對映檔案處使用cache配置快取
  3. 注意: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 元素來引用另外一個快取。