1.緩存介紹
?Mybatis提供查詢緩存,如果緩存中有數(shù)據(jù)就不用從數(shù)據(jù)庫中獲取睛藻,用于減輕數(shù)據(jù)壓力三幻,提高系統(tǒng)性能。
?Mybatis的查詢緩存總共有兩級(jí)矿微,我們稱之為一級(jí)緩存和二級(jí)緩存痕慢,如圖:?
一級(jí)緩存是SqlSession級(jí)別的緩存。在操作數(shù)據(jù)庫時(shí)需要構(gòu)造 sqlSession對(duì)象涌矢,在對(duì)象中有一個(gè)數(shù)據(jù)結(jié)構(gòu)(HashMap)用于存儲(chǔ)緩存數(shù)據(jù)掖举。不同的sqlSession之間的緩存數(shù)據(jù)區(qū)域(HashMap)是互相不影響的。
二級(jí)緩存是Mapper(namespace)級(jí)別的緩存娜庇。多個(gè)SqlSession去操作同一個(gè)Mapper的sql語句塔次,多個(gè)SqlSession可以共用二級(jí)緩存,二級(jí)緩存是跨SqlSession的名秀。
2.一級(jí)緩存
? ? (1)?Mybatis默認(rèn)開啟了一級(jí)緩存
? ? (2)原理圖
? ??
第一次發(fā)起查詢用戶id為1的用戶信息励负,先去找緩存中是否有id為1的用戶信息,如果沒有匕得,從數(shù)據(jù)庫查詢用戶信息继榆,將查詢到的用戶信息存儲(chǔ)到一級(jí)緩存中。
如果中間sqlSession去執(zhí)行commit操作(執(zhí)行插入耗跛、更新裕照、刪除),清空SqlSession中的一級(jí)緩存调塌,這樣做的目的為了讓緩存中存儲(chǔ)的是最新的信息偶芍,避免臟讀筑公。
第二次發(fā)起查詢用戶id為1的用戶信息偿警,先去找緩存中是否有id為1的用戶信息,緩存中有偶妖,直接從緩存中獲取用戶信息。
3.二級(jí)緩存
? ? (1) 二級(jí)緩存是namespace級(jí)別的,默認(rèn)不開啟
? ? (2) 開啟步驟
? ? ? ? 1)?<settings>
? ? ? ? <setting?"cacheEnabled"value="true"/>
????????</settings>
? ? ? ? 2) 在mapper.xml中 加入標(biāo)簽 <cache/> 核心參數(shù)可不設(shè)置 使用默認(rèn)參數(shù)
? ??????<!--開啟本mapper下的namespace的二級(jí)緩存政溃,默認(rèn)使用的是mybatis提供的PerpetualCache -->
? ? (3) 原理圖
? ??
第一次調(diào)用mapper下的SQL去查詢用戶信息趾访。查詢到的信息會(huì)存到該mapper對(duì)應(yīng)的二級(jí)緩存區(qū)域內(nèi)。
第二次調(diào)用相同namespace下的mapper映射文件中相同的SQL去查詢用戶信息董虱。會(huì)去對(duì)應(yīng)的二級(jí)緩存內(nèi)取結(jié)果扼鞋。
如果調(diào)用相同namespace下的mapper映射文件中的增刪改SQL,并執(zhí)行了commit操作愤诱。此時(shí)會(huì)清空該namespace下的二級(jí)緩存云头。
禁用二級(jí)緩存
默認(rèn)二級(jí)緩存的粒度是Mapper級(jí)別的,但是如果在同一個(gè)Mapper文件中某個(gè)查詢不想使用二級(jí)緩存的話淫半,就需要對(duì)緩存的控制粒度更細(xì)溃槐。
在select標(biāo)簽中設(shè)置useCache=false,可以禁用當(dāng)前select語句的二級(jí)緩存科吭,即每次查詢都是去數(shù)據(jù)庫中查詢昏滴,默認(rèn)情況下是true,即該statement使用二級(jí)緩存对人。
<selectid="findUserById"parameterType="int"
?????????????????? resultType="com.kkb.mybatis.po.User"useCache="true">
???????? SELECT * FROM user WHERE id = #{id}
</select>
刷新二級(jí)緩存
通過flushCache屬性谣殊,可以控制select、insert规伐、update蟹倾、delete標(biāo)簽是否屬性二級(jí)緩存
默認(rèn)設(shè)置
?????? *默認(rèn)情況下如果是select語句,那么flushCache是false猖闪。
?????? *如果是insert、update肌厨、delete語句培慌,那么flushCache是true。
默認(rèn)配置解讀
?????? *如果查詢語句設(shè)置成true柑爸,那么每次查詢都是去數(shù)據(jù)庫查詢吵护,即意味著該查詢的二級(jí)緩存失效。
?????? *如果增刪改語句設(shè)置成false表鳍,即使用二級(jí)緩存馅而,那么如果在數(shù)據(jù)庫中修改了數(shù)據(jù),而緩存數(shù)據(jù)還是原來的譬圣,這個(gè)時(shí)候就會(huì)出現(xiàn)臟讀瓮恭。
flushCache設(shè)置如下:
<selectid="findUserById"parameterType="int"
?????????????????? resultType="com.kkb.mybatis.po.User"useCache="true"flushCache="true">
?????????????????? SELECT * FROM user WHERE id =#{id}
</select>