面我們介紹了mybatis自帶的二級緩存,但是這個緩存是單服務器工作,無法實現分布式緩存。那么什么是分布式緩存呢?假設現在有兩個服務器1和2,用戶訪問的時候訪問了1服務器,查詢后的緩存就會放在1服務器上,假設現在有個用戶訪問的是2服務器,那么他在2服務器上就無法獲取剛剛那個緩存,如下圖所示:

為了解決這個問題,就得找一個分布式的緩存,專門用來存儲緩存數據的,這樣不同的服務器要緩存數據都往它那里存,取緩存數據也從它那里取,如下圖所示:

如上圖所示,在幾個不同的服務器之間,我們使用第三方緩存框架,將緩存都放在這個第三方框架中,然后無論有多少台服務器,我們都能從緩存中獲取數據。
這里我們介紹mybatis與第三方框架ehcache的整合。
①、導入 mybatis-ehcache 整合包(最上面的源代碼中包含有)

②、在全局配置文件 mybatis-configuration.xml 開啟緩存
|
1
2
3
4
|
<!--開啟二級緩存 -->
<settings>
<setting name=
"cacheEnabled"
value=
"true"
/>
</settings>
|
③、在 xxxMapper.xml 文件中整合 ehcache 緩存
將如下的類的全類名寫入<cache type="" ></cache>的type屬性中
|
1
2
3
4
5
|
<!-- 開啟本mapper的namespace下的二級緩存
type:指定cache接口的實現類的類型,不寫type屬性,mybatis默認使用PerpetualCache
要和ehcache整合,需要配置type為ehcache實現cache接口的類型
-->
<cache type=
"org.mybatis.caches.ehcache.EhcacheCache"
></cache>
|
④、配置緩存參數
在 classpath 目錄下新建一個 ehcache.xml 文件,並增加如下配置:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
<?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(先進先出)
4、二級緩存的應用場景
對於訪問多的查詢請求且用戶對查詢結果實時性要求不高,此時可采用mybatis二級緩存技術降低數據庫訪問量,提高訪問速度,業務場景比如:耗時較高的統計分析sql、電話賬單查詢sql等。實現方法如下:通過設置刷新間隔時間,由mybatis每隔一段時間自動清空緩存,根據數據變化頻率設置緩存刷新間隔flushInterval,比如設置為30分鍾、60分鍾、24小時等,根據需求而定。
mybatis二級緩存對細粒度的數據級別的緩存實現不好,比如如下需求:對商品信息進行緩存,由於商品信息查詢訪問量大,但是要求用戶每次都能查詢最新的商品信息,此時如果使用mybatis的二級緩存就無法實現當一個商品變化時只刷新該商品的緩存信息而不刷新其它商品的信息,因為mybaits的二級緩存區域以mapper為單位划分的,當一個商品信息變化會將所有商品信息的緩存數據全部清空。解決此類問題可能需要在業務層根據需求對數據有針對性緩存。
