《介紹1》:
一、 Mybatis+Ehcache配置
為了提高MyBatis的性能,有時候我們需要加入緩存支持,目前用的比較多的緩存莫過于ehcache緩存了,ehcache性能強大,而且位各種應用都提供了解決方案,在此我們主要是做查詢緩存,提高查詢的效率.
整合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
資源已上傳到百度網盤點擊此處下載蛾绎,其中包括了一些mybatis的jar包忱屑,log4j,mysql驅動等必須的包
將上述包加入項目之后纵苛,新建一個文件名锉桑,該文件名必須為ehcache.xml铺厨,放在類路徑下面,內容如下:
?-->
配置自定義緩存
name:Cache的唯一標識
maxElementsInMemory:緩存中允許創(chuàng)建的最大對象數
maxElementsOnDisk:磁盤中最大緩存對象數颈走,若是0表示無窮大
eternal:Element是否永久有效膳灶,一但設置了,timeout將不起作用,對象永不過期轧钓。
timeToIdleSeconds:緩存數據的鈍化時間序厉,也就是在一個元素消亡之前,
兩次訪問時間的最大時間間隔值毕箍,這只能在元素不是永久駐留時有效弛房,
如果該值是?0?就意味著元素可以停頓無窮長的時間。
timeToLiveSeconds:緩存數據的生存時間而柑,也就是一個元素從構建到消亡的最大時間間隔值文捶,???????????????????????????????這只能在元素不是永久駐留時有效,如果該值是0就意味著元素可以停頓無窮長的時間媒咳。
overflowToDisk:內存不足時粹排,是否啟用磁盤緩存。
diskPersistent:是否緩存虛擬機重啟期數據
diskExpiryThreadIntervalSeconds:磁盤失效線程運行時間間隔涩澡,默認是120秒
diskSpoolBufferSizeMB:這個參數設置DiskStore(磁盤緩存)的緩存區(qū)大小顽耳。默認是30MB。每個Cache都應該有自己的一個緩沖區(qū)
memoryStoreEvictionPolicy:緩存滿了之后的淘汰算法妙同。默認策略是LRU(最近最少使用)射富。你可以設置為FIFO(先進先出)或是LFU(較少使用)
maxElementsInMemory="10000"
eternal="false"
overflowToDisk="false"
timeToIdleSeconds="900"
timeToLiveSeconds="1800"
memoryStoreEvictionPolicy="LFU"?/>????-->
該文件是ehcache的配置文件,上面的注釋已經說得很清楚了,這里我用的是默認的配置
至此ehcache已經配置好了,然后只需要在你想要緩存的mapper配置文件里面加入以下內容,該查詢語句得到的結果將會被緩存
標簽二選一,第一個可以輸出日志,第二個不輸出日志?只要在對應的mapper配置文件中加入標簽即可-->?-->select?*?from?person?where?id=#{id}
這樣就對這個mapper里面的各種結果進行了緩存。程序中不需要修改任何地方粥帚。
這個過程不復雜胰耗,也沒什么難度,不過Mybatis的官方說的也太含糊了茎辐。附件下面有宪郊,需要的各種jar包已經包含。點擊下載附件拖陆。原文地址:http://qiuqiu0034.iteye.com/blog/1162952
二弛槐、 springMVC+mybatis+ehcache詳細配置
首先需要先需要兩個主要的jar包
ehcache-core-2.4.6.jar
mybatis-ehcache-1.0.1.jar
ehcache-core一定要1.3以上的版本 因為1.3之前好像不支持集群的。然后需要創(chuàng)建一個ehcache.xml在類路徑下面
配置自定義緩存
maxElementsInMemory:緩存中允許創(chuàng)建的最大對象數
eternal:緩存中對象是否為永久的依啰,如果是乎串,超時設置將被忽略,對象從不過期速警。
timeToIdleSeconds:緩存數據的鈍化時間叹誉,也就是在一個元素消亡之前,
兩次訪問時間的最大時間間隔值闷旧,這只能在元素不是永久駐留時有效长豁,
如果該值是?0?就意味著元素可以停頓無窮長的時間。
timeToLiveSeconds:緩存數據的生存時間忙灼,也就是一個元素從構建到消亡的最大時間間隔值匠襟,??????????????????????????????????????這只能在元素不是永久駐留時有效钝侠,如果該值是0就意味著元素可以停頓無窮長的時間。
overflowToDisk:內存不足時酸舍,是否啟用磁盤緩存帅韧。
memoryStoreEvictionPolicy:緩存滿了之后的淘汰算法。
-->
上面的diskStor path 你可以指定某一個路徑下啃勉,java.io.tmpdir 指的是你系統(tǒng)的緩存目錄忽舟,可以百度下然后一般這個xml都需要有一個defaultCache,就是默認的cache配置 ?里面有哪些參數自己可以網上查查api
然后下面我還配置了一個testCache淮阐,我找網上資料 沒看到哪里明說叮阅,然后我自己測試,發(fā)現(xiàn)ehcache是可以生成多個cache的泣特,每個cache可以根據不同的業(yè)務場景作用于不同的業(yè)務(即里面的參數配置不同),所以這樣看似多配置了,其實是更加增加了靈活性帘饶。
然后在spring的配置文件里面加上一段配置:
這樣就可以把ehcache和spring整合起來了
然后在對應的mapper.xml 里面加上
后面的參數配置不加也可以,都會有一個默認值群扶,大家也可以查查一共有哪些配置,然后根據自己的需要來配置镀裤,然后這個配置是會帶上cache執(zhí)行的日志竞阐,如果不要帶日志可以把LogginEhcache改成EhcacheCache。
在mapper.xml這樣設置了默認是全部操作都會執(zhí)行緩存策略暑劝,如果有某些sql不需要執(zhí)行骆莹,可以把useCache設置為false。
其實經過這樣的配置ehcache已經基本OK了担猛。接下來就測試一下幕垦。
原文測試代碼如下:
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條輸出語句
首先是查詢一次某表 ? ? 執(zhí)行了查詢sql
然后給某表插入一條信息 ?執(zhí)行了插入sql
然后再查詢某表 ? 執(zhí)行了查詢sql,這是正確的 ?因為你執(zhí)行了非查詢語句傅联,這個時候需要重新訪問數據庫
然后再一次查詢某表 ?沒有執(zhí)行查詢sql ? ?這代表緩存是有用的先改,他就沒有訪問數據庫了,直接從內存或者磁盤里面獲取了
也可以根據count來查看操作的時間
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了