mybatis整合分散式快取框架
什麼是分散式快取
為了提高系統的併發效能,通常會對系統進行分散式部署(如叢集部署方式)
如上圖,伺服器1上的mybatis的二級快取位於伺服器1上,伺服器2上的mybatis的二級快取位於伺服器2上。
所以如果不使用分散式快取,快取的資料就會在各個伺服器上單獨儲存,因此,需要使用分散式快取工具對快取資料進行集中管理。
mybatis無法實現分散式快取,所以需要和第三方分散式快取框架進行整合,如redis, memcached, ehcache等。
即使拋開分散式快取,就普通快取來說,mybatis也不是專業做快取的。快取資料是在記憶體中儲存的,快取工具需要對資料進行一些壓縮處理,或安全的編碼處理等,mybatis只是簡單地把資料存到記憶體中了。
整合方法
mybatis提供了一個cache介面,如果要實現自己的快取邏輯,可以通過實現cache介面進行開發。 比如 mybatis 和 ehcache 的整合包中就提供了一個cache介面的實現類。
如果要將mybatis和redis進行整合,就需要考慮如何實現這個cache介面,然後在介面內部去操作redis的資料結構。
getId(), 即獲取cache的唯一標識,即key值
putObject(key, value),向快取中寫入資料,value是select查詢出來的結果集
getObject(key) , 根據key值,從快取中取出value
mybatis的一級快取和二級快取都是以HashMap結構儲存的。
PerpetualCache是mybatis預設實現的Cache類,可以仿照這個寫cache實現類。
在相應的mapper.xml配置檔案中,配置該mapper的二級快取:
mybatis整合ehcache
- 加入ehcache包
- 在相應的mapper.xml配置檔案中進行配置,將cache標籤的type屬性設定成Ehcache對mybatis的Cache介面的實現型別 EhcacheCache
- 加入ehcache的配置檔案
在classpath下建立ehcache.xml配置檔案,配置如下內容:
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../config/ehcache.xsd"> <diskStore path="F:\develop\ehcache" /> <defaultCache maxElementsInMemory="1000" maxElementsOnDisk="10000000" eternal="false" overflowToDisk="false" timeToIdleSeconds="120" timeToLiveSeconds="120" diskExpiryThreadIntervalSeconds="120" memoryStoreEvictionPolicy="LRU"> </defaultCache> </ehcache>
屬性說明:
diskStore:指定資料在磁碟中的儲存位置。
defaultCache:當藉助CacheManager.add(“demoCache”)建立Cache時,EhCache便會採用指定的的管理策略
以下屬性是必須的:
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(先進先出)