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