Mybatis 支持兩級緩存小泉,分別是一級緩存(session 級別曼库,又稱本地緩存)和二級緩存(namespace 級別禀酱,又稱全局緩存);
其中一級緩存默認(rèn)開啟涛救,在于數(shù)據(jù)庫相同的會話期間查詢到的數(shù)據(jù)會放在本地緩存畏邢,之后再查詢相同的數(shù)據(jù)會直接從本地緩存中取州叠;但在四種情況下棵红,一級緩存會失效:
1、使用不同的會話請求相同的數(shù)據(jù)咧栗;
2逆甜、使用相同的會話,請求不同的數(shù)據(jù)致板;
3交煞、使用相同的會話,在請求之間執(zhí)行了增刪改操作斟或,不論該操作是否針對一級緩存中的數(shù)據(jù)素征;
4、使用相同的會話萝挤,在請求之間主動(dòng)清楚了一級緩存(session.clearCache())御毅;
二級緩存默認(rèn)開啟(但未配置),工作機(jī)制為:當(dāng)使用 session 查詢完數(shù)據(jù)之后將數(shù)據(jù)先保存在一級緩存中怜珍,在 session 關(guān)閉時(shí)端蛆,將一級緩存的數(shù)據(jù)取出并放進(jìn)與之對應(yīng)的 map 中,不同的 namespace 之間不共享 map酥泛;使用流程:
1)開啟全局緩存配置今豆;
2)在 mapper.xml 文件中配置使用二級緩存(因?yàn)槎壘彺媸腔?namespace 的,每個(gè) mapper.xml 文件對應(yīng)一個(gè) namespace)
3)對應(yīng)的 POJO 或者 PO 必須實(shí)現(xiàn)序列化接口(因?yàn)楫?dāng) readOnly=false 時(shí)柔袁,緩存在返回?cái)?shù)據(jù)的時(shí)候會使用到序列化的技術(shù))
注意事項(xiàng):
1)對于首次查詢到的數(shù)據(jù)呆躲,默認(rèn)都是放在一級緩存中的,只有當(dāng) session 提交或者關(guān)閉之后捶索,數(shù)據(jù)才會轉(zhuǎn)移到二級緩存中插掂,也就是說在 session 提交或者關(guān)閉之前,二級緩存中是沒有相關(guān)數(shù)據(jù)的腥例;
2)cache 標(biāo)簽中中的 cacheEnabled=false 只會關(guān)閉二級緩存燥筷,而不會關(guān)閉一級緩存;select 標(biāo)簽中的 useCache=false 也只會關(guān)閉二級緩存院崇,優(yōu)先級高于 cache 標(biāo)簽肆氓;
3)對于每一個(gè)增刪改標(biāo)簽中都有 flushCache 屬性,當(dāng) flushCache=true時(shí)底瓣,每次執(zhí)行完增刪改之后會同時(shí)清空一級緩存和二級緩存谢揪;對于查詢標(biāo)簽蕉陋,默認(rèn) flushCache=false,當(dāng) flushCache=true 時(shí)拨扶,每個(gè)查詢操作執(zhí)行完凳鬓,都會清空一級緩存和二級緩存;
4)session.clearCache 只會清空一級緩存患民;
5)localCacheScope 全局設(shè)置可以配置一級緩存的作用域缩举,默認(rèn)值為 session(使用一級緩存),當(dāng)設(shè)定值為 statement 時(shí)匹颤,相當(dāng)于禁用一級緩存仅孩;
第三方緩存整合:
1)導(dǎo)入第三方緩存的 jar 包;
2)導(dǎo)入 Mybatis 與第三方緩存的適配包(GitHub 上的 Mybatis 頂級項(xiàng)目下)印蓖;
3)在 mapper.xml 中使用 cache 標(biāo)簽辽慕,通過 type 屬性指定適配包接口的全類名。
關(guān)注微信公眾號:Javall咖啡屋
每天更新各種技術(shù)學(xué)習(xí)心得體會