spring+Mybatis+Ehcache整合實(shí)現(xiàn)數(shù)據(jù)緩存

《介紹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了

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 前言 主題是Mybatis一級(jí)和二級(jí)緩存的應(yīng)用及源碼分析。希望在本場(chǎng)chat結(jié)束后,能夠幫助讀者朋友明白以下三點(diǎn)。...
    余平的余_余平的平閱讀 1,414評(píng)論 0 12
  • MyBatis--查詢(xún)緩存 查詢(xún)緩存的使用,主要是為了提高查詢(xún)?cè)L問(wèn)速度。將用戶(hù)對(duì)同一數(shù)據(jù)的重復(fù)查詢(xún)過(guò)程簡(jiǎn)化,不再每...
    我可能是個(gè)假開(kāi)發(fā)閱讀 3,156評(píng)論 3 13
  • 一、 Mybatis+Ehcache配置 為了提高M(jìn)yBatis的性能,有時(shí)候我們需要加入緩存支持,目前用的比較多...
    丸_子閱讀 1,094評(píng)論 1 7
  • 1. 簡(jiǎn)介 1.1 什么是 MyBatis ? MyBatis 是支持定制化 SQL、存儲(chǔ)過(guò)程以及高級(jí)映射的優(yōu)秀的...
    笨鳥(niǎo)慢飛閱讀 6,220評(píng)論 0 4
  • 首先,確保你已經(jīng)關(guān)掉了openfire 輸入以下命令 sudo rm -rf /Library/Preferenc...
    YM_1閱讀 534評(píng)論 0 0

友情鏈接更多精彩內(nèi)容