一、一級(jí)緩存(本地緩存)
sqlSession級(jí)別的緩存。一級(jí)緩存是一直開啟的;SqlSession級(jí)別的一個(gè)Map與數(shù)據(jù)庫同一次會(huì)話期間查詢到的數(shù)據(jù)會(huì)放在本地緩存中。以后如果需要獲取相同的數(shù)據(jù),直接從緩存中拿,沒必要再去查詢數(shù)據(jù)庫;
一級(jí)緩存失效情況(沒有使用到當(dāng)前一級(jí)緩存的情況,效果就是,還需要再向數(shù)據(jù)庫發(fā)出查詢):
1、sqlSession不同
2、sqlSession相同,查詢條件不同。(當(dāng)前一級(jí)緩存中還沒有這個(gè)數(shù)據(jù))
3、sqlSession相同,兩次查詢之間執(zhí)行了增刪改操作(這次增刪改可能對(duì)當(dāng)前數(shù)據(jù)有影響)
4、sqlSession相同,手動(dòng)清除了一級(jí)緩存。
二、二級(jí)緩存(全局緩存)
基本namespace級(jí)別的緩存:一個(gè)namespace對(duì)應(yīng)一個(gè)二級(jí)緩存:
工作機(jī)制:
1、一個(gè)會(huì)話,查詢一條數(shù)據(jù),這個(gè)數(shù)據(jù)就會(huì)被放在當(dāng)前會(huì)話的一級(jí)緩存中:
2、如果會(huì)話關(guān)閉:一級(jí)會(huì)話中的緩存會(huì)被保存到二級(jí)緩存中;新的會(huì)話查詢信息,就可以參照二級(jí)緩存中的內(nèi)容。
3、不同namespace查出的數(shù)據(jù)會(huì)放在自己對(duì)應(yīng)的緩存中(map)
效果:數(shù)據(jù)會(huì)從二級(jí)緩存中獲取,查出的數(shù)據(jù)會(huì)默認(rèn)先放在一級(jí)緩存中,只有會(huì)話提交或者關(guān)閉以后,一級(jí)緩存中的數(shù)據(jù)才會(huì)轉(zhuǎn)移到二級(jí)緩存中
4、如何開啟二級(jí)緩存:
?、匍_啟全局二級(jí)緩存配置:
<setting name="cacheEnabled" value="true"/>
?、谌apper.xml中配置使用二級(jí)緩存:
<cache></cache>
?、蹖?duì)應(yīng)的POJO實(shí)現(xiàn)序列化接口
5、和緩存有關(guān)的設(shè)置屬性
?、賑acheEnabled=true:false:關(guān)閉緩存(二級(jí)緩存關(guān)閉)(一級(jí)緩存一直可用的)
②每個(gè)select標(biāo)簽都有useCache="true":false:不使用緩存(一級(jí)緩存依然使用,二級(jí)緩存不使用)
?、?每個(gè)增刪改標(biāo)簽的:flushCache="true":(一級(jí)二級(jí)都會(huì)清除)
?、躶qlSession.clearCache();只是清楚當(dāng)前session的一級(jí)緩存;
⑤全局配置localCacheScope:
本地緩存作用域:(一級(jí)緩存SESSION);當(dāng)前會(huì)話的所有數(shù)據(jù)保存在會(huì)話緩存中;
STATEMENT:可以禁用一級(jí)緩存。
6、第三方緩存整合
①導(dǎo)入第三方緩存包即可;
?、趯?dǎo)入與第三方緩存整合的適配包;官方有;
?、踡apper.xml中使用自定義緩存
使用Ehcache緩存框架
<cache type="org.mybatis.caches.ehcache.EhcacheCache"></cache>
7、cache標(biāo)簽配置參數(shù):
<cache eviction="FIFO" flushInterval="60000" readOnly="false" size="1024"></cache>
eviction:緩存的回收策略:
• LRU – 最近最少使用的:移除最長(zhǎng)時(shí)間不被使用的對(duì)象。
• FIFO – 先進(jìn)先出:按對(duì)象進(jìn)入緩存的順序來移除它們。
• SOFT – 軟引用:移除基于垃圾回收器狀態(tài)和軟引用規(guī)則的對(duì)象。
• WEAK – 弱引用:更積極地移除基于垃圾收集器狀態(tài)和弱引用規(guī)則的對(duì)象。
• 默認(rèn)的是 LRU。
flushInterval:緩存刷新間隔
緩存多長(zhǎng)時(shí)間清空一次,默認(rèn)不清空,設(shè)置一個(gè)毫秒值。
readOnly:是否只讀:
true:只讀;mybatis認(rèn)為所有從緩存中獲取數(shù)據(jù)的操作都是只讀操作,不會(huì)修改數(shù)據(jù)。mybatis為了加快獲取速度,直接就會(huì)將數(shù)據(jù)在緩存中的引用交給用戶。不安全,速度快。
false:非只讀:mybatis覺得獲取的數(shù)據(jù)可能會(huì)被修改。mybatis會(huì)利用序列化&反序列的技術(shù)克隆一份新的數(shù)據(jù)給你。安全,速度慢
size:緩存存放多少元素;
type="":指定自定義緩存的全類名;實(shí)現(xiàn)Cache接口即可;
三、ehcache.xml配置
<?xml version="1.0" encoding="UTF-8"?> <ehcache xmlns:xsi="/tupian/20230522/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../config/ehcache.xsd"> <!-- 磁盤保存路徑 --> <diskStore path="java.io.tmpdir"/> <defaultCache maxElementsInMemory="1" maxElementsOnDisk="10000000" eternal="false" overflowToDisk="true" timeToIdleSeconds="120" timeToLiveSeconds="120" diskExpiryThreadIntervalSeconds="120" memoryStoreEvictionPolicy="LRU"> </defaultCache> </ehcache>
新聞標(biāo)題:MyBatis緩存實(shí)現(xiàn)原理及代碼實(shí)例解析-創(chuàng)新互聯(lián)
鏈接URL:http://aaarwkj.com/article10/iphgo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站制作、微信公眾號(hào)、虛擬主機(jī)、企業(yè)建站、網(wǎng)站導(dǎo)航、關(guān)鍵詞優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)