mybatis 緩存(cache)的使用


許多應用程序,為了提高性能而增加緩存, 特別是從數據庫中獲取的數據. 在默認情況下,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" 了嗎? 這可以避免使用緩存。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM