從數據庫中加載的數據緩存到內存中,是不少應用程序爲了提升性能而採起的一向作法。MyBatis對經過映射的SELECT語句加載的查詢結果提供了內建的緩存支持。默認狀況下,啓用一級緩存;即,若是你使用同一個SqlSession接口對象調用了相同的SELECT語句,則直接會從緩存中返回結果,而不是再查詢一次數據庫,但Session 被 Close 或者 Flush 後,緩存將被清除。MyBatis的二級緩存就是全局緩存,能夠被全部SqlSession共享,MyBatis 包含一個很是強大的查詢緩存特性,它能夠很是方便地配置和定製。默認狀況下是沒有開啓緩存的,要開啓二級緩存,你須要在你的 SQL 映射文件中添加一行: 算法
<cache /> 數據庫
而且要開啓全局的 Settings 中啓用全局緩存: 緩存
<setting name="cacheEnabled" value="true" /> 安全
緩存默認值以下: mybatis
全部的這些屬性均可以經過緩存元素的屬性來修改。好比: app
<cache 框架
eviction="FIFO" dom
flushInterval="60000" 性能
size="512" spa
readOnly="true"/>
這個更高級的配置建立了一個 FIFO 緩存,並每隔 60 秒刷新,存數結果對象或列表的 512 個引用,並且返回的對象被認爲是隻讀的,所以在不一樣線程中的調用者之間修改它們會 致使衝突。
可用的收回策略有:
注意:須要緩存的對象必需要繼承 Serializable 接口,須要支持序列化
使用自定義緩存
除了這些自定義緩存的方式, 你也能夠經過實現你本身的緩存或爲其餘第三方緩存方案 建立適配器來徹底覆蓋緩存行爲。
<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();
}
這個特殊命名空間的惟一緩存會被使用或者刷新相同命名空間內的語句。也許未來的某個時候,你會想在命名空間中共享相同的緩存配置和實例。在這樣的狀況下你能夠使用 cache-ref 元素來引用另一個緩存。
<cache-ref namespace="com.someone.application.data.SomeMapper"/>