一、什么是緩存
緩存是存在于內(nèi)存中的臨時(shí)數(shù)據(jù)。
使用緩存減少和數(shù)據(jù)庫(kù)的交互次數(shù),提高執(zhí)行效率。
1、適用于緩存
經(jīng)常查詢并且不經(jīng)常改變的;
數(shù)據(jù)的正確與否對(duì)最終結(jié)果影響不大的;
2、不適用于緩存
經(jīng)常改變的數(shù)據(jù);
數(shù)據(jù)的正確與否對(duì)最終結(jié)果影響很大的;
例如:商品的庫(kù)存,銀行的匯率,股市的牌價(jià);
二、mybatis一級(jí)緩存
1、一級(jí)緩存簡(jiǎn)介
一級(jí)緩存作用域是sqlsession級(jí)別的,同一個(gè)sqlsession中執(zhí)行相同的sql查詢(相同的sql和參數(shù)),第一次會(huì)去查詢數(shù)據(jù)庫(kù)并寫(xiě)到緩存中,第二次從一級(jí)緩存中取。
一級(jí)緩存是基于 PerpetualCache 的 HashMap 本地緩存,默認(rèn)打開(kāi)一級(jí)緩存。
2、何時(shí)清空一級(jí)緩存
如果中間sqlSession去執(zhí)行commit操作(執(zhí)行插入、更新、刪除),則會(huì)清空SqlSession中的一級(jí)緩存,這樣做的目的為了讓緩存中存儲(chǔ)的是最新的信息,避免臟讀。
一級(jí)緩存時(shí)執(zhí)行commit,close,增刪改等操作,就會(huì)清空當(dāng)前的一級(jí)緩存;當(dāng)對(duì)SqlSession執(zhí)行更新操作(update、delete、insert)后并執(zhí)行commit時(shí),不僅清空其自身的一級(jí)緩存(執(zhí)行更新操作的效果),也清空二級(jí)緩存(執(zhí)行commit()的效果)。
3、一級(jí)緩存無(wú)過(guò)期時(shí)間,只有生命周期
MyBatis在開(kāi)啟一個(gè)數(shù)據(jù)庫(kù)會(huì)話時(shí),會(huì)創(chuàng)建一個(gè)新的SqlSession對(duì)象,SqlSession對(duì)象中會(huì)有一個(gè)Executor對(duì)象,Executor對(duì)象中持有一個(gè)PerpetualCache對(duì)象,見(jiàn)下面代碼。當(dāng)會(huì)話結(jié)束時(shí),SqlSession對(duì)象及其內(nèi)部的Executor對(duì)象還有PerpetualCache對(duì)象也一并釋放掉。
三、mybatis二級(jí)緩存
1、二級(jí)緩存簡(jiǎn)介
它指的是Mybatis中SqlSessionFactory對(duì)象的緩存。由同一個(gè)SqlSessionFactory對(duì)象創(chuàng)建的SqlSession共享其緩存。
二級(jí)緩存是 mapper 映射級(jí)別的緩存,多個(gè) SqlSession 去操作同一個(gè) Mapper 映射的 sql 語(yǔ)句,多個(gè)SqlSession 可以共用二級(jí)緩存,二級(jí)緩存是跨 SqlSession 的。
2、二級(jí)緩存何時(shí)存入
在關(guān)閉sqlsession后(close),才會(huì)把該sqlsession一級(jí)緩存中的數(shù)據(jù)添加到namespace的二級(jí)緩存中。
開(kāi)啟了二級(jí)緩存后,還需要將要緩存的pojo實(shí)現(xiàn)Serializable接口,為了將緩存數(shù)據(jù)取出執(zhí)行反序列化操作,因?yàn)槎?jí)緩存數(shù)據(jù)存儲(chǔ)介質(zhì)多種多樣,不一定只存在內(nèi)存中,有可能存在硬盤(pán)中。
3、二級(jí)緩存有過(guò)期時(shí)間,但沒(méi)有后臺(tái)線程進(jìn)行檢測(cè)
需要注意的是,并不是key-value的過(guò)期時(shí)間,而是這個(gè)cache的過(guò)期時(shí)間,是flushInterval,意味著整個(gè)清空緩存cache,所以不需要后臺(tái)線程去定時(shí)檢測(cè)。
每當(dāng)存取數(shù)據(jù)的時(shí)候,都有檢測(cè)一下cache的生命時(shí)間,默認(rèn)是1小時(shí),如果這個(gè)cache存活了一個(gè)小時(shí),那么將整個(gè)清空一下。
4、當(dāng) Mybatis 調(diào)用 Dao 層查詢數(shù)據(jù)庫(kù)時(shí),先查詢二級(jí)緩存,二級(jí)緩存中無(wú)對(duì)應(yīng)數(shù)據(jù),再去查詢一級(jí)緩存,一級(jí)緩存中也沒(méi)有,最后去數(shù)據(jù)庫(kù)查找。
————————————————
版權(quán)聲明:本文為CSDN博主「哪 吒」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/guorui_java/article/details/118095020