[原创]mybatis中整合ehcache缓存框架的使用
mybatis整合ehcache緩存框架的使用
mybaits的二級(jí)緩存是mapper范圍級(jí)別,除了在SqlMapConfig.xml設(shè)置二級(jí)緩存的總開(kāi)關(guān),還要在具體的mapper.xml中開(kāi)啟二級(jí)緩存。
1.開(kāi)啟mybatis的二級(jí)緩存
在核心配置文件SqlMapConfig.xml中加入
1 <settings> 2 <!-- 開(kāi)啟二級(jí)緩存 --> 3 <setting name="cacheEnabled" value="true"/> 4 </settings>?
2.導(dǎo)入ehcache相關(guān)jar包
ehcache-core-2.6.5.jar
mybatis-ehcache-1.0.2.jar
3.在classpath下加入ehcache.xml文件
?
屬性說(shuō)明:
? diskStore:指定數(shù)據(jù)在磁盤(pán)中的存儲(chǔ)位置。
? defaultCache:當(dāng)借助CacheManager.add("demoCache")創(chuàng)建Cache時(shí),EhCache便會(huì)采用<defalutCache/>指定的的管理策略
以下屬性是必須的:
? maxElementsInMemory - 在內(nèi)存中緩存的element的最大數(shù)目
? maxElementsOnDisk - 在磁盤(pán)上緩存的element的最大數(shù)目,若是0表示無(wú)窮大
? eternal - 設(shè)定緩存的elements是否永遠(yuǎn)不過(guò)期。如果為true,則緩存的數(shù)據(jù)始終有效,如果為false那么還要根據(jù)timeToIdleSeconds,timeToLiveSeconds判斷
? overflowToDisk - 設(shè)定當(dāng)內(nèi)存緩存溢出的時(shí)候是否將過(guò)期的element緩存到磁盤(pán)上
以下屬性是可選的:
? timeToIdleSeconds - 當(dāng)緩存在EhCache中的數(shù)據(jù)前后兩次訪問(wèn)的時(shí)間超過(guò)timeToIdleSeconds的屬性取值時(shí),這些數(shù)據(jù)便會(huì)刪除,默認(rèn)值是0,也就是可閑置時(shí)間無(wú)窮大
? timeToLiveSeconds - 緩存element的有效生命期,默認(rèn)是0.,也就是element存活時(shí)間無(wú)窮大
diskSpoolBufferSizeMB 這個(gè)參數(shù)設(shè)置DiskStore(磁盤(pán)緩存)的緩存區(qū)大小.默認(rèn)是30MB.每個(gè)Cache都應(yīng)該有自己的一個(gè)緩沖區(qū).
? diskPersistent - 在VM重啟的時(shí)候是否啟用磁盤(pán)保存EhCache中的數(shù)據(jù),默認(rèn)是false。
? diskExpiryThreadIntervalSeconds - 磁盤(pán)緩存的清理線程運(yùn)行間隔,默認(rèn)是120秒。每個(gè)120s,相應(yīng)的線程會(huì)進(jìn)行一次EhCache中數(shù)據(jù)的清理工作
? memoryStoreEvictionPolicy - 當(dāng)內(nèi)存緩存達(dá)到最大,有新的element加入的時(shí)候, 移除緩存中element的策略。默認(rèn)是LRU(最近最少使用),可選的有LFU(最不常使用)和FIFO(先進(jìn)先出)
4.在UserMapper.xml中開(kāi)啟二緩存,UserMapper.xml下的sql執(zhí)行完成會(huì)存儲(chǔ)到它的緩存區(qū)域(HashMap)
根據(jù)需求調(diào)整緩存參數(shù):
1 <cache type="org.mybatis.caches.ehcache.EhcacheCache" > 2 <property name="timeToIdleSeconds" value="3600"/> 3 <property name="timeToLiveSeconds" value="3600"/> 4 <!-- 同ehcache參數(shù)maxElementsInMemory --> 5 <property name="maxEntriesLocalHeap" value="1000"/> 6 <!-- 同ehcache參數(shù)maxElementsOnDisk --> 7 <property name="maxEntriesLocalDisk" value="10000000"/> 8 <property name="memoryStoreEvictionPolicy" value="LRU"/> 9 </cache>?
log4j打印如下日志,說(shuō)明緩存開(kāi)啟成功:
DEBUG [main] - Cache Hit Ratio [cn.itcast.jdbc.mapper.UserMapper]: 0.0
應(yīng)用場(chǎng)景:
對(duì)于訪問(wèn)多的查詢(xún)請(qǐng)求且用戶(hù)對(duì)查詢(xún)結(jié)果實(shí)時(shí)性要求不高,此時(shí)可采用mybatis二級(jí)緩存技術(shù)降低數(shù)據(jù)庫(kù)訪問(wèn)量,提高訪問(wèn)速度,業(yè)務(wù)場(chǎng)景比如:耗時(shí)較高的統(tǒng)計(jì)分析sql、電話賬單查詢(xún)sql等。
實(shí)現(xiàn)方法如下:通過(guò)設(shè)置刷新間隔時(shí)間,由mybatis每隔一段時(shí)間自動(dòng)清空緩存,根據(jù)數(shù)據(jù)變化頻率設(shè)置緩存刷新間隔flushInterval,比如設(shè)置為30分鐘、60分鐘、24小時(shí)等,根據(jù)需求而定。
局限性:
mybatis二級(jí)緩存對(duì)細(xì)粒度的數(shù)據(jù)級(jí)別的緩存實(shí)現(xiàn)不好,比如如下需求:對(duì)商品信息進(jìn)行緩存,由于商品信息查詢(xún)?cè)L問(wèn)量大,但是要求用戶(hù)每次都能查詢(xún)最新的商品信息,此時(shí)如果使用mybatis的二級(jí)緩存就無(wú)法實(shí)現(xiàn)當(dāng)一個(gè)商品變化時(shí)只刷新該商品的緩存信息而不刷新其它商品的信息,因?yàn)閙ybaits的二級(jí)緩存區(qū)域以mapper為單位劃分,當(dāng)一個(gè)商品信息變化會(huì)將所有商品信息的緩存數(shù)據(jù)全部清空。解決此類(lèi)問(wèn)題需要在業(yè)務(wù)層根據(jù)需求對(duì)數(shù)據(jù)有針對(duì)性緩存。
緩存都是實(shí)現(xiàn)了Cache這個(gè)接口.....
public class EhCache implements Cache{}
作者:little飛 出處:http://www.cnblogs.com/little-fly/ 歡迎轉(zhuǎn)載 也請(qǐng)保留這段聲明 謝謝!
轉(zhuǎn)載于:https://www.cnblogs.com/little-fly/p/6251439.html
總結(jié)
以上是生活随笔為你收集整理的[原创]mybatis中整合ehcache缓存框架的使用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: IP组播与组播协议
- 下一篇: 正点原子STM32串口例程解析