MyBatis 包含一個很是強大的查詢緩存特性,它能夠很是方便地配置和定製。MyBatis 3 中的緩存實現的不少改進都已經實現了,使得它更增強大並且易於配置。java
默認狀況下是沒有開啓緩存的,除了局部的 session 緩存,能夠加強變現並且處理循環 依賴也是必須的。要開啓二級緩存,你須要在你的 SQL 映射文件中添加一行:git
<cache/>
字面上看就是這樣。這個簡單語句的效果以下:github
全部的這些屬性均可以經過緩存元素的屬性來修改。好比:算法
<cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true"/>
這個更高級的配置建立了一個 FIFO 緩存,並每隔 60 秒刷新,存數結果對象或列表的 512 個引用,並且返回的對象被認爲是隻讀的,所以在不一樣線程中的調用者之間修改它們會 致使衝突。spring
可用的收回策略有:apache
默認的是 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; }
http://www.jianshu.com/p/2d654b0fca56
回想一下上一節內容, 這個特殊命名空間的惟一緩存會被使用或者刷新相同命名空間內 的語句。也許未來的某個時候,你會想在命名空間中共享相同的緩存配置和實例。在這樣的 狀況下你可使用 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查詢支持二級緩存,你須要保證:
https://github.com/wyh-spring-ecosystem-student/spring-boot-student/tree/releases
spring-boot-student-mybatis工程