1. 程式人生 > >mybatis中二級快取整合ehcache實現分散式快取

mybatis中二級快取整合ehcache實現分散式快取

    mybatis自帶二級快取,但是這個快取是單伺服器工作,無法實現分散式快取。那麼什麼是分散式快取呢?假設現在有兩個伺服器1和2,使用者訪問的時候訪問了1伺服器,查詢後的快取就會放在1伺服器上,假設現在有個使用者訪問的是2伺服器,那麼他在2伺服器上就無法獲取剛剛那個快取,如下圖所示:

    為了解決這個問題,就得找一個分散式的快取,專門用來儲存快取資料的,這樣不同的伺服器要快取資料都往它那裡存,取快取資料也從它那裡取,如下圖所示: 

    如上圖所示,在幾個不同的伺服器之間,我們使用第三方快取框架,將快取都放在這個第三方框架中,然後無論有多少臺伺服器,我們都能從快取中獲取資料。

 這裡我們介紹mybatis與第三方框架ehcache的整合。

 上文一開始提到過,mybatis提供了一個cache介面,如果要實現自己的快取邏輯,實現cache介面開發即可。mybatis本身預設實現了一個,但是這個快取的實現無法實現分散式快取,所以我們要自己來實現。ehcache分散式快取就可以,mybatis提供了一個針對cache介面的ehcache實現類,這個類在mybatis和ehcache的整合包中。

①、匯入 mybatis-ehcache 整合包(最上面的原始碼中包含有)

<dependency>
	<groupId>org.mybatis.caches</groupId>
	<artifactId>mybatis-ehcache</artifactId>
	<version>1.1.0</version>
</dependency>

 

②、在全域性配置檔案 mybatis-configuration.xml 開啟快取

<!--開啟二級快取  -->
<settings>
    <setting name="cacheEnabled" value="true"/>
</settings>

③、在 對映檔案xxxMapper.xml 檔案中整合 ehcache 快取

<!-- 開啟本mapper的namespace下的二級快取
    type:指定cache介面的實現類的型別,
不寫type屬性,mybatis預設使用PerpetualCache作為預設的二級快取,不具有分散式快取的能力
要和ehcache整合,需要配置type為ehcache實現cache介面的型別
-->
<cache type="org.mybatis.caches.ehcache.EhcacheCache"></cache>

④、配置快取引數

在 classpath 目錄下新建一個 ehcache.xml 檔案,並增加如下配置:

<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="../config/ehcache.xsd">
 
    <diskStore path="F:\develop\ehcache"/>
 
    <defaultCache
            maxElementsInMemory="10000"
            eternal="false"
            timeToIdleSeconds="120"
            timeToLiveSeconds="120"
            maxElementsOnDisk="10000000"
            diskExpiryThreadIntervalSeconds="120"
            memoryStoreEvictionPolicy="LRU">
        <persistence strategy="localTempSwap"/>
    </defaultCache>
     
</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(先進先出)