《介紹1》:
一、 Mybatis+Ehcache配置
為了提高M(jìn)yBatis的性能,有時(shí)候我們需要加入緩存支持,目前用的比較多的緩存莫過(guò)于ehcache緩存了,ehcache性能強(qiáng)大,而且位各種應(yīng)用都提供了解決方案,在此我們主要是做查詢(xún)緩存,提高查詢(xún)的效率.
整合MyBatis和ehcache需要的jar包如下:
ehcache-core-2.4.4.jar
mybatis-ehcache-1.0.0.jar
slf4j-api-1.6.1.jar
slf4j-log4j12-1.6.2.jar
資源已上傳到百度網(wǎng)盤(pán)點(diǎn)擊此處下載,其中包括了一些mybatis的jar包,log4j,mysql驅(qū)動(dòng)等必須的包
將上述包加入項(xiàng)目之后,新建一個(gè)文件名,該文件名必須為ehcache.xml,放在類(lèi)路徑下面,內(nèi)容如下:
?-->
配置自定義緩存
name:Cache的唯一標(biāo)識(shí)
maxElementsInMemory:緩存中允許創(chuàng)建的最大對(duì)象數(shù)
maxElementsOnDisk:磁盤(pán)中最大緩存對(duì)象數(shù),若是0表示無(wú)窮大
eternal:Element是否永久有效,一但設(shè)置了,timeout將不起作用,對(duì)象永不過(guò)期。
timeToIdleSeconds:緩存數(shù)據(jù)的鈍化時(shí)間,也就是在一個(gè)元素消亡之前,
兩次訪問(wèn)時(shí)間的最大時(shí)間間隔值,這只能在元素不是永久駐留時(shí)有效,
如果該值是?0?就意味著元素可以停頓無(wú)窮長(zhǎng)的時(shí)間。
timeToLiveSeconds:緩存數(shù)據(jù)的生存時(shí)間,也就是一個(gè)元素從構(gòu)建到消亡的最大時(shí)間間隔值,???????????????????????????????這只能在元素不是永久駐留時(shí)有效,如果該值是0就意味著元素可以停頓無(wú)窮長(zhǎng)的時(shí)間。
overflowToDisk:內(nèi)存不足時(shí),是否啟用磁盤(pán)緩存。
diskPersistent:是否緩存虛擬機(jī)重啟期數(shù)據(jù)
diskExpiryThreadIntervalSeconds:磁盤(pán)失效線程運(yùn)行時(shí)間間隔,默認(rèn)是120秒
diskSpoolBufferSizeMB:這個(gè)參數(shù)設(shè)置DiskStore(磁盤(pán)緩存)的緩存區(qū)大小。默認(rèn)是30MB。每個(gè)Cache都應(yīng)該有自己的一個(gè)緩沖區(qū)
memoryStoreEvictionPolicy:緩存滿(mǎn)了之后的淘汰算法。默認(rèn)策略是LRU(最近最少使用)。你可以設(shè)置為FIFO(先進(jìn)先出)或是LFU(較少使用)
maxElementsInMemory="10000"
eternal="false"
overflowToDisk="false"
timeToIdleSeconds="900"
timeToLiveSeconds="1800"
memoryStoreEvictionPolicy="LFU"?/>????-->
該文件是ehcache的配置文件,上面的注釋已經(jīng)說(shuō)得很清楚了,這里我用的是默認(rèn)的配置
至此ehcache已經(jīng)配置好了,然后只需要在你想要緩存的mapper配置文件里面加入以下內(nèi)容,該查詢(xún)語(yǔ)句得到的結(jié)果將會(huì)被緩存
標(biāo)簽二選一,第一個(gè)可以輸出日志,第二個(gè)不輸出日志?只要在對(duì)應(yīng)的mapper配置文件中加入標(biāo)簽即可-->?-->select?*?from?person?where?id=#{id}
這樣就對(duì)這個(gè)mapper里面的各種結(jié)果進(jìn)行了緩存。程序中不需要修改任何地方。
這個(gè)過(guò)程不復(fù)雜,也沒(méi)什么難度,不過(guò)Mybatis的官方說(shuō)的也太含糊了。附件下面有,需要的各種jar包已經(jīng)包含。點(diǎn)擊下載附件。原文地址:http://qiuqiu0034.iteye.com/blog/1162952
二、 springMVC+mybatis+ehcache詳細(xì)配置
首先需要先需要兩個(gè)主要的jar包
ehcache-core-2.4.6.jar
mybatis-ehcache-1.0.1.jar
ehcache-core一定要1.3以上的版本 因?yàn)?.3之前好像不支持集群的。然后需要?jiǎng)?chuàng)建一個(gè)ehcache.xml在類(lèi)路徑下面
配置自定義緩存
maxElementsInMemory:緩存中允許創(chuàng)建的最大對(duì)象數(shù)
eternal:緩存中對(duì)象是否為永久的,如果是,超時(shí)設(shè)置將被忽略,對(duì)象從不過(guò)期。
timeToIdleSeconds:緩存數(shù)據(jù)的鈍化時(shí)間,也就是在一個(gè)元素消亡之前,
兩次訪問(wèn)時(shí)間的最大時(shí)間間隔值,這只能在元素不是永久駐留時(shí)有效,
如果該值是?0?就意味著元素可以停頓無(wú)窮長(zhǎng)的時(shí)間。
timeToLiveSeconds:緩存數(shù)據(jù)的生存時(shí)間,也就是一個(gè)元素從構(gòu)建到消亡的最大時(shí)間間隔值,??????????????????????????????????????這只能在元素不是永久駐留時(shí)有效,如果該值是0就意味著元素可以停頓無(wú)窮長(zhǎng)的時(shí)間。
overflowToDisk:內(nèi)存不足時(shí),是否啟用磁盤(pán)緩存。
memoryStoreEvictionPolicy:緩存滿(mǎn)了之后的淘汰算法。
-->
上面的diskStor path 你可以指定某一個(gè)路徑下,java.io.tmpdir 指的是你系統(tǒng)的緩存目錄,可以百度下然后一般這個(gè)xml都需要有一個(gè)defaultCache,就是默認(rèn)的cache配置 ?里面有哪些參數(shù)自己可以網(wǎng)上查查api
然后下面我還配置了一個(gè)testCache,我找網(wǎng)上資料 沒(méi)看到哪里明說(shuō),然后我自己測(cè)試,發(fā)現(xiàn)ehcache是可以生成多個(gè)cache的,每個(gè)cache可以根據(jù)不同的業(yè)務(wù)場(chǎng)景作用于不同的業(yè)務(wù)(即里面的參數(shù)配置不同),所以這樣看似多配置了,其實(shí)是更加增加了靈活性。
然后在spring的配置文件里面加上一段配置:
這樣就可以把ehcache和spring整合起來(lái)了
然后在對(duì)應(yīng)的mapper.xml 里面加上
后面的參數(shù)配置不加也可以,都會(huì)有一個(gè)默認(rèn)值,大家也可以查查一共有哪些配置,然后根據(jù)自己的需要來(lái)配置,然后這個(gè)配置是會(huì)帶上cache執(zhí)行的日志,如果不要帶日志可以把LogginEhcache改成EhcacheCache。
在mapper.xml這樣設(shè)置了默認(rèn)是全部操作都會(huì)執(zhí)行緩存策略,如果有某些sql不需要執(zhí)行,可以把useCache設(shè)置為false。
其實(shí)經(jīng)過(guò)這樣的配置ehcache已經(jīng)基本OK了。接下來(lái)就測(cè)試一下。
原文測(cè)試代碼如下:
longbegin=?System.nanoTime();??????????tempService.selectAll();??????????longend=?System.nanoTime()?-begin;??????????System.out.println("count?:"+end);//the?second?timebegin=?System.nanoTime();??????????try?{??????????????tempService.insertTblUserTemp("1","1","1","1");??????????}?catch?(NoSuchAlgorithmException?e)?{??????????????e.printStackTrace();??????????}end=?System.nanoTime()?-begin;??????????System.out.println("count?:"+end);//the?second?timebegin=?System.nanoTime();??????????tempService.selectAll();end=?System.nanoTime()?-begin;??????????System.out.println("count?:"+end);//the?third?timebegin=?System.nanoTime();??????????tempService.selectAll();end=?System.nanoTime()?-begin;??????????System.out.println("count?:"+end);return"";
這里面有4條輸出語(yǔ)句
首先是查詢(xún)一次某表 ? ? 執(zhí)行了查詢(xún)sql
然后給某表插入一條信息 ?執(zhí)行了插入sql
然后再查詢(xún)某表 ? 執(zhí)行了查詢(xún)sql,這是正確的 ?因?yàn)槟銏?zhí)行了非查詢(xún)語(yǔ)句,這個(gè)時(shí)候需要重新訪問(wèn)數(shù)據(jù)庫(kù)
然后再一次查詢(xún)某表 ?沒(méi)有執(zhí)行查詢(xún)sql ? ?這代表緩存是有用的,他就沒(méi)有訪問(wèn)數(shù)據(jù)庫(kù)了,直接從內(nèi)存或者磁盤(pán)里面獲取了
也可以根據(jù)count來(lái)查看操作的時(shí)間
count :681719
————————————————-com.anenjoy.manage.mapper.TblUserTempMapper.insert
insert into TBLUSERTEMP (ACTIVECODE, PASSWORDMD5, PASSWORDRANDOMKEY,
PHONE, EMAIL, USERNAME,
AWARTAR, STATUS, CREATEDATE,
USERID, IMSI, CHECKCODE
)
values (?, ?, ?,
?, ?, ?,
?, ?, ?,
?, ?, ?
)
count :129557388
————————————————-com.anenjoy.manage.mapper.TblUserTempMapper.selectByExample
select
ACTIVECODE, PASSWORDMD5, PASSWORDRANDOMKEY, PHONE, EMAIL, USERNAME, AWARTAR, STATUS,
CREATEDATE, USERID, IMSI, CHECKCODE
from TBLUSERTEMP
count :333938203
count :560704
然后這些基本上OK了