1. 程式人生 > >Mybatis——緩存機制

Mybatis——緩存機制

作用 3.1 span mybatis second 編寫 級別 安全 規則

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 元素來引用另外一個緩存。

Mybatis——緩存機制