1. 程式人生 > >mybatis配置自帶快取和第三方快取

mybatis配置自帶快取和第三方快取

轉載mybatis配置自帶快取和第三方快取

參考:https://mybatis.github.io/mybatis-3/zh/sqlmap-xml.html,

http://www.yihaomen.com/article/java/428.htm

 

 

許多應用程式,為了提高效能而增加快取, 特別是從資料庫中獲取的資料. 在預設情況下,mybatis 的一級快取是預設開啟的。類似於hibernate, 所謂一級快取,也就是基於同一個sqlsession 的查詢語句,即 session 級別的快取,非全域性快取,或者非二級快取.

如果要實現 mybatis 的二級快取,一般來說有如下兩種方式:
1. 採用 mybatis 內建的 cache 機制。
2. 採用三方 cache 框架, 比如ehcache, oscache 等等.

採用 mybatis 內建的 cache 機制。


在 sql 語句對映檔案中加入 <cache /> 語句 , 並且相應的 model 類要實現 java Serializable 介面,因為快取說白了就是序列化與反序列化的過程,所以需要實現這個介面. 單純的 <cache /> 表示如下意思:

1.所有在對映檔案裡的 select 語句都將被快取。
2.所有在對映檔案裡 insert,update 和 delete 語句會清空快取。
3.快取使用“最近很少使用”演算法來回收
4.快取不會被設定的時間所清空。
5.每個快取可以儲存 1024 個列表或物件的引用(不管查詢出來的結果是什麼) 。
6.快取將作為“讀/寫”快取,意味著獲取的物件不是共享的且對呼叫者是安全的。不會有其它的呼叫者或執行緒潛在修改。
快取元素的所有特性都可以通過屬性來修改。比如:

程式程式碼 程式程式碼


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



採用 ehcache 來實現 mybatis  的二級快取 

首先需要在 mybatis 的官網上下載相關jar 包:https://code.google.com/p/mybatis/ 寫文件的時候下載的是:mybatis-ehcache-1.0.2.zip ,裡面包括了

程式程式碼 程式程式碼


mybatis-ehcache-1.0.2.jar
ehcache-core-2.6.5.jar
slf4j-api-1.6.1.jar



當然,採用ehcache 就必須在 classpath 下 加入ehcache 的配置檔案 ehcache.xml:

程式程式碼 程式程式碼


<cache name="default"
    maxElementsInMemory="10000"
    eternal="false"
    timeToIdleSeconds="3600"
    timeToLiveSeconds="10"
    overflowToDisk="true"
    diskPersistent="true"
    diskExpiryThreadIntervalSeconds="120"
    maxElementsOnDisk="10000"
/>



那麼在 sql 對映檔案中要如何配置呢,參考如下:

程式程式碼 程式程式碼


<cache type="org.mybatis.caches.ehcache.LoggingEhcache" > 
        <property name="timeToIdleSeconds" value="3600"/><!--1 hour-->
        <property name="timeToLiveSeconds" value="3600"/><!--1 hour-->
        <property name="maxEntriesLocalHeap" value="1000"/>
        <property name="maxEntriesLocalDisk" value="10000000"/>
        <property name="memoryStoreEvictionPolicy" value="LRU"/>
    </cache>



總結:無論是採用mybatis 自身的cache  還是三方的cache , 這樣的配置,就是對 所有的select 語句都全域性快取,但事實上,並不總是這樣,比如,我在這系列教程中第七章中 http://www.yihaomen.com/article/java/326.htm,自己寫的分頁演算法,就不能用這種情況。需要禁止掉cache ,所以需要如下方法:

程式程式碼 程式程式碼


<select id="selectArticleListPage" resultMap="resultUserArticleList" useCache="false">
.......



注意到 useCache="false" 了嗎? 這可以避免使用快取。