許多應(yīng)用程序,,為了提高性能而增加緩存, 特別是從數(shù)據(jù)庫中獲取的數(shù)據(jù). 在默認(rèn)情況下,mybatis 的一級緩存是默認(rèn)開啟的,。類似于hibernate, 所謂一級緩存,,也就是基于同一個sqlsession 的查詢語句,即 session 級別的緩存,非全局緩存,,或者非二級緩存. 如果要實(shí)現(xiàn) mybatis 的二級緩存,,一般來說有如下兩種方式: 1. 采用 mybatis 內(nèi)置的 cache 機(jī)制。 2. 采用三方 cache 框架,, 比如ehcache, oscache 等等. 采用 mybatis 內(nèi)置的 cache 機(jī)制,。 在 sql 語句映射文件中加入 <cache /> 語句 , 并且相應(yīng)的 model 類要實(shí)現(xiàn) java Serializable 接口,因為緩存說白了就是序列化與反序列化的過程,,所以需要實(shí)現(xiàn)這個接口. 單純的 <cache /> 表示如下意思: 1.所有在映射文件里的 select 語句都將被緩存,。 2.所有在映射文件里 insert,update 和 delete 語句會清空緩存。 3.緩存使用“最近很少使用”算法來回收 4.緩存不會被設(shè)定的時間所清空,。 5.每個緩存可以存儲 1024 個列表或?qū)ο蟮囊茫ú还懿樵兂鰜淼慕Y(jié)果是什么) ,。 6.緩存將作為“讀/寫”緩存,意味著獲取的對象不是共享的且對調(diào)用者是安全的,。不會有其它的調(diào)用者或線程潛在修改,。 緩存元素的所有特性都可以通過屬性來修改。比如: 程序代碼 <cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true" /> 采用 ehcache 來實(shí)現(xiàn) mybatis 的二級緩存 首先需要在 mybatis 的官網(wǎng)上下載相關(guān)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 當(dāng)然,,采用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> 總結(jié):無論是采用mybatis 自身的cache 還是三方的cache , 這樣的配置,,就是對 所有的select 語句都全局緩存,,但事實(shí)上,并不總是這樣,,比如,,我在這系列教程中第七章中 http://www./article/java/326.htm,自己寫的分頁算法,,就不能用這種情況,。需要禁止掉cache ,所以需要如下方法: 程序代碼 <select id="selectArticleListPage" resultMap="resultUserArticleList" useCache="false"> ....... 注意到 useCache="false" 了嗎? 這可以避免使用緩存,。 除非申明,文章均為一號門原創(chuàng),轉(zhuǎn)載請注明本文地址,謝謝!
|
|