关于mybatis缓存配置讲解
一級(jí)緩存:
一級(jí)緩存是默認(rèn)的.
測(cè)試:在WEB頁(yè)面同一個(gè)查詢執(zhí)行兩次從日志里面看同樣的sql查詢執(zhí)行兩次。
2次sql查詢,看似我們使用了同一個(gè)sqlSession,但是實(shí)際上因?yàn)槲覀兊膁ao繼承了SqlSessionDaoSupport,而SqlSessionDaoSupport內(nèi)部sqlSession的實(shí)現(xiàn)是使用用動(dòng)態(tài)代理實(shí)現(xiàn)的,這個(gè)動(dòng)態(tài)代理sqlSessionProxy使用一個(gè)模板方法封裝了select()等操作,每一次select()查詢都會(huì)自動(dòng)先執(zhí)行openSession(),執(zhí)行完close()以后調(diào)用close()方法,相當(dāng)于生成了一個(gè)新的session實(shí)例,所以我們無(wú)需手動(dòng)的去關(guān)閉這個(gè)session()(關(guān)于這一點(diǎn)見(jiàn)下面mybatis的官方文檔),當(dāng)然也無(wú)法使用mybatis的一級(jí)緩存,也就是說(shuō)mybatis的一級(jí)緩存在spring中是沒(méi)有作用的.
二級(jí)緩存:
配置:
<mapper namespace="com.cnblogs.yjmyzz.mybatis.mapper.OrderMapper">
<cache
eviction="LRU"
flushInterval="60000"
size="1024"
readOnly="true"
/>
...
</mapper>
這里有幾個(gè)要注意的地方:
eviction是緩存的淘汰算法,可選值有"LRU"、"FIFO"、"SOFT"、"WEAK",缺省值是LRU
flashInterval指緩存過(guò)期時(shí)間,單位為毫秒,60000即為60秒,缺省值為空,即只要容量足夠,永不過(guò)期
size指緩存多少個(gè)對(duì)象,默認(rèn)值為1024
readOnly是否只讀,如果為true,則所有相同的sql語(yǔ)句返回的是同一個(gè)對(duì)象(有助于提高性能,但并發(fā)操作同一條數(shù)據(jù)時(shí),可能不安全),如果設(shè)置為false,則相同的sql,后面訪問(wèn)的是cache的clone副本。
上面這個(gè)是全局設(shè)置,在每條單獨(dú)的sql語(yǔ)句上,還可以有局部設(shè)置,比如:
<select id="getOrder" parameterType="int" resultType="TOrder" useCache="false">
...
</select>
useCache="false"表示該select語(yǔ)句不使用緩存(即使xml最開(kāi)頭的全局cache啟用)
默認(rèn)情況下,如果全局開(kāi)啟了緩存,insert/update/delete成功后,會(huì)自動(dòng)刷新相關(guān)的緩存項(xiàng),但有一點(diǎn)要特別注意:在mybatis與hibernate混用時(shí),由于mybatis與hibernate的緩存是無(wú)關(guān)的,如果用mybatis做select查詢,用hibernate做insert/update/delete,hibernate對(duì)數(shù)據(jù)的修改,并不會(huì)刷新mybatis的緩存。
總結(jié)
以上是生活随笔為你收集整理的关于mybatis缓存配置讲解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 机器学习——HMM & CRF
- 下一篇: Linux基础(6)