mybatis二級快取應用及與ehcache整合

Mindy_Lou發表於2016-06-23

mybaits的二級快取是mapper範圍級別,除了在SqlMapConfig.xml設定二級快取的總開關,還要在具體的mapper.xml中開啟二級快取。


1.開啟mybatis的二級快取

在核心配置檔案SqlMapConfig.xml中加入

[html] view plain copy
  1.       <settings>  
  2. <!-- 開啟二級快取 -->  
  3. <setting name="cacheEnabled" value="true"/>  
  4. lt;/settings>  


2.匯入ehcache相關jar包

ehcache-core-2.6.5.jar

mybatis-ehcache-1.0.2.jar


3.在classpath下加入ehcache.xml檔案

[html] view plain copy
  1. <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  2.     xsi:noNamespaceSchemaLocation="../config/ehcache.xsd">  
  3.     <diskStore path="F:\develop\ehcache" />  
  4.     <defaultCache   
  5.         maxElementsInMemory="1000"   
  6.         maxElementsOnDisk="10000000"  
  7.         eternal="false"   
  8.         overflowToDisk="false"   
  9.         timeToIdleSeconds="120"  
  10.         timeToLiveSeconds="120"   
  11.         diskExpiryThreadIntervalSeconds="120"  
  12.         memoryStoreEvictionPolicy="LRU">  
  13.     </defaultCache>  
  14. </ehcache>  

屬性說明:
 diskStore:指定資料在磁碟中的儲存位置。
 defaultCache:當藉助CacheManager.add("demoCache")建立Cache時,EhCache便會採用<defalutCache/>指定的的管理策略
以下屬性是必須的:
 maxElementsInMemory - 在記憶體中快取的element的最大數目 
 maxElementsOnDisk - 在磁碟上快取的element的最大數目,若是0表示無窮大
 eternal - 設定快取的elements是否永遠不過期。如果為true,則快取的資料始終有效,如果為false那麼還要根據timeToIdleSeconds,timeToLiveSeconds判斷
 overflowToDisk - 設定當記憶體快取溢位的時候是否將過期的element快取到磁碟上
以下屬性是可選的:
 timeToIdleSeconds - 當快取在EhCache中的資料前後兩次訪問的時間超過timeToIdleSeconds的屬性取值時,這些資料便會刪除,預設值是0,也就是可閒置時間無窮大
 timeToLiveSeconds - 快取element的有效生命期,預設是0.,也就是element存活時間無窮大
diskSpoolBufferSizeMB 這個引數設定DiskStore(磁碟快取)的快取區大小.預設是30MB.每個Cache都應該有自己的一個緩衝區.
 diskPersistent - 在VM重啟的時候是否啟用磁碟儲存EhCache中的資料,預設是false。
 diskExpiryThreadIntervalSeconds - 磁碟快取的清理執行緒執行間隔,預設是120秒。每個120s,相應的執行緒會進行一次EhCache中資料的清理工作
 memoryStoreEvictionPolicy - 當記憶體快取達到最大,有新的element加入的時候, 移除快取中element的策略。預設是LRU(最近最少使用),可選的有LFU(最不常使用)和FIFO(先進先出)


4.在UserMapper.xml中開啟二快取,UserMapper.xml下的sql執行完成會儲存到它的快取區域(HashMap)

根據需求調整快取引數:

[html] view plain copy
  1. <cache type="org.mybatis.caches.ehcache.EhcacheCache" >   
  2.         <property name="timeToIdleSeconds" value="3600"/>  
  3.         <property name="timeToLiveSeconds" value="3600"/>  
  4.         <!-- 同ehcache引數maxElementsInMemory -->  
  5.         <property name="maxEntriesLocalHeap" value="1000"/>  
  6.         <!-- 同ehcache引數maxElementsOnDisk -->  
  7.         <property name="maxEntriesLocalDisk" value="10000000"/>  
  8.         <property name="memoryStoreEvictionPolicy" value="LRU"/>  
  9.     </cache>  

log4j列印如下日誌,說明快取開啟成功:

DEBUG [main] - Cache Hit Ratio [cn.itcast.jdbc.mapper.UserMapper]: 0.0


應用場景:
對於訪問多的查詢請求且使用者對查詢結果實時性要求不高,此時可採用mybatis二級快取技術降低資料庫訪問量,提高訪問速度,業務場景比如:耗時較高的統計分析sql、電話賬單查詢sql等。
實現方法如下:通過設定重新整理間隔時間,由mybatis每隔一段時間自動清空快取,根據資料變化頻率設定快取重新整理間隔flushInterval,比如設定為30分鐘、60分鐘、24小時等,根據需求而定。



侷限性:
mybatis二級快取對細粒度的資料級別的快取實現不好,比如如下需求:對商品資訊進行快取,由於商品資訊查詢訪問量大,但是要求使用者每次都能查詢最新的商品資訊,此時如果使用mybatis的二級快取就無法實現當一個商品變化時只重新整理該商品的快取資訊而不重新整理其它商品的資訊,因為mybaits的二級快取區域以mapper為單位劃分,當一個商品資訊變化會將所有商品資訊的快取資料全部清空。解決此類問題需要在業務層根據需求對資料有針對性快取。

相關文章