Spring Boot + Mybatis + 二級緩存實例(Ehcache,Redis)

使用Mybatis自帶二級緩存

MyBatis 包含一個很是強大的查詢緩存特性,它能夠很是方便地配置和定製。MyBatis 3 中的緩存實現的不少改進都已經實現了,使得它更增強大並且易於配置。java

默認狀況下是沒有開啓緩存的,除了局部的 session 緩存,能夠加強變現並且處理循環 依賴也是必須的。要開啓二級緩存,你須要在你的 SQL 映射文件中添加一行:git

<cache/>

字面上看就是這樣。這個簡單語句的效果以下:github

  • 映射語句文件中的全部 select 語句將會被緩存。
  • 映射語句文件中的全部 insert,update 和 delete 語句會刷新緩存。
  • 緩存會使用 Least Recently Used(LRU,最近最少使用的)算法來收回。
  • 根據時間表(好比 no Flush Interval,沒有刷新間隔), 緩存不會以任什麼時候間順序來刷新。
  • 緩存會存儲列表集合或對象(不管查詢方法返回什麼)的 1024 個引用。
  • 緩存會被視爲是 read/write(可讀/可寫)的緩存,意味着對象檢索不是共享的,並且能夠安全地被調用者修改,而不干擾其餘調用者或線程所作的潛在修改。

全部的這些屬性均可以經過緩存元素的屬性來修改。好比:算法

<cache
  eviction="FIFO"
  flushInterval="60000"
  size="512"
  readOnly="true"/>

這個更高級的配置建立了一個 FIFO 緩存,並每隔 60 秒刷新,存數結果對象或列表的 512 個引用,並且返回的對象被認爲是隻讀的,所以在不一樣線程中的調用者之間修改它們會 致使衝突。spring

可用的收回策略有:apache

  • LRU – 最近最少使用的:移除最長時間不被使用的對象。
  • FIFO – 先進先出:按對象進入緩存的順序來移除它們。
  • SOFT – 軟引用:移除基於垃圾回收器狀態和軟引用規則的對象。
  • WEAK – 弱引用:更積極地移除基於垃圾收集器狀態和弱引用規則的對象。

默認的是 LRU。緩存

flushInterval(刷新間隔)能夠被設置爲任意的正整數,並且它們表明一個合理的毫秒 形式的時間段。默認狀況是不設置,也就是沒有刷新間隔,緩存僅僅調用語句時刷新。安全

size(引用數目)能夠被設置爲任意正整數,要記住你緩存的對象數目和你運行環境的 可用內存資源數目。默認值是 1024。session

readOnly(只讀)屬性能夠被設置爲 true 或 false。只讀的緩存會給全部調用者返回緩 存對象的相同實例。所以這些對象不能被修改。這提供了很重要的性能優點。可讀寫的緩存 會返回緩存對象的拷貝(經過序列化) 。這會慢一些,可是安全,所以默認是 false。mybatis

使用自定義緩存

除了這些自定義緩存的方式, 你也能夠經過實現你本身的緩存或爲其餘第三方緩存方案 建立適配器來徹底覆蓋緩存行爲。

<cache type="com.domain.something.MyCustomCache"/>

這個示 例展 示了 如何 使用 一個 自定義 的緩 存實 現。type 屬 性指 定的 類必 須實現 org.mybatis.cache.Cache 接口。這個接口是 MyBatis 框架中不少複雜的接口之一,可是簡單 給定它作什麼就行。

public interface Cache {
  String getId();
  int getSize();
  void putObject(Object key, Object value);
  Object getObject(Object key);
  boolean hasKey(Object key);
  Object removeObject(Object key);
  void clear();
}

要配置你的緩存, 簡單和公有的 JavaBeans 屬性來配置你的緩存實現, 並且是經過 cache 元素來傳遞屬性, 好比, 下面代碼會在你的緩存實現中調用一個稱爲 「setCacheFile(String file)」 的方法:

<cache type="com.domain.something.MyCustomCache">
  <property name="cacheFile" value="/tmp/my-custom-cache.tmp"/>
</cache>

你可使用全部簡單類型做爲 JavaBeans 的屬性,MyBatis 會進行轉換。 And you can specify a placeholder(e.g. ${cache.file}) to replace value defined at configuration properties.

Since 3.4.2, the MyBatis has been supported to call an initialization method after it's set all properties. If you want to use this feature, please implements the org.apache.ibatis.builder.InitializingObject interface on your custom cache class.

public interface InitializingObject {
  void initialize() throws Exception;
}

使用第三方緩存

Ehcache

http://www.jianshu.com/p/2d654b0fca56

Redis

參照緩存

回想一下上一節內容, 這個特殊命名空間的惟一緩存會被使用或者刷新相同命名空間內 的語句。也許未來的某個時候,你會想在命名空間中共享相同的緩存配置和實例。在這樣的 狀況下你可使用 cache-ref 元素來引用另一個緩存。

<cache-ref namespace="com.someone.application.data.SomeMapper"/>

總結

注意:緩存配置和緩存實例是綁定在 SQL 映射文件的命名空間是很重要的。所以,全部在相同命名空間的語句正如綁定的緩存同樣。 語句能夠修改和緩存交互的方式,或在語句的語句的基礎上使用兩種簡單的屬性來徹底排除它們。默認狀況下,語句能夠這樣來配置:

<select ... flushCache="false" useCache="true"/>
<insert ... flushCache="true"/>
<update ... flushCache="true"/>
<delete ... flushCache="true"/>

由於那些是默認的,你明顯不能明確地以這種方式來配置一條語句。相反,若是你想改 變默認的行爲,只能設置 flushCache 和 useCache 屬性。好比,在一些狀況下你也許想排除 從緩存中查詢特定語句結果,或者你也許想要一個查詢語句來刷新緩存。類似地,你也許有 一些更新語句依靠執行而不須要刷新緩存。

要想使某條Select查詢支持二級緩存,你須要保證:

  1. MyBatis支持二級緩存的總開關:全局配置變量參數 cacheEnabled=true
  2. 該select語句所在的Mapper,配置了<cache> 或<cached-ref>節點,而且有效
  3. 該select語句的參數 useCache=true

源碼

https://github.com/wyh-spring-ecosystem-student/spring-boot-student/tree/releases

spring-boot-student-mybatis工程

相關文章
相關標籤/搜索