下一页亚洲11p_国产精品亚洲第一页在线观看_麻豆影院在线观看免费视频_亚洲色播在线观看_激情亚洲欧美另类小说图片

您現(xiàn)在的位置 :

首頁  >  企業(yè)新聞 >  > 正文

天天新動態(tài):聊聊Mybatis的緩存

時間 :2023-01-12 05:19:52   來源 : 程序員客棧

記得點(diǎn)擊"歡少的成長之路",設(shè)為星標(biāo)?

后臺點(diǎn)擊【聯(lián)系我】,申請加入優(yōu)質(zhì)技術(shù)學(xué)習(xí)社群


(資料圖)

大家好,我是Leo。

好久沒有輸出技術(shù)理論了,實(shí)在是忙。最近主要以設(shè)計(jì)系統(tǒng)為主了。面試剛好又倒在了Mybatis原理。今天來聊一下Mybatis的一級緩存,二級緩存。

Mybatis緩存是內(nèi)存中的數(shù)據(jù),主要是對數(shù)據(jù)庫查詢結(jié)果的保存,使用緩存的好處是避免頻繁與數(shù)據(jù)庫進(jìn)行交互,提升查詢的響應(yīng)速度。

數(shù)據(jù)庫緩存擴(kuò)展

聊到Mybatis緩存。我們可以擴(kuò)展聊一下MySQL緩存。MySQL緩存其實(shí)與Mybatis類似,在查詢的時候都會先通過查詢緩存檢查一下所需的數(shù)據(jù)是否存在緩存中,如果存在緩存的話就會直接返回,這樣就達(dá)到了避免頻繁與數(shù)據(jù)庫進(jìn)行交互的目的。

數(shù)據(jù)查詢流程圖

在學(xué)習(xí)過程中,希望大家把知識點(diǎn)串起來學(xué)習(xí),這樣有助力更好的學(xué)習(xí)與理解

回歸正題

Mybatis 緩存主要分一級緩存和二級緩存。

一級緩存

一級緩存也稱為本地緩存(SqlSession),屬于二級緩存的子集。與數(shù)據(jù)庫同一次會話期間查詢到的數(shù)據(jù)會放在本地緩存中。以后如果需要獲取相同的數(shù)據(jù),直接從緩存中拿,沒必要再去查詢數(shù)據(jù)庫。

一級緩存的緩存數(shù)據(jù)只在SqlSession內(nèi)有效,它的范圍有兩種SESSION和STATEMENT,默認(rèn)是SESSION。如果不想使用一級緩存,可以通過下列代碼配置

使用SESSION,這樣每次執(zhí)行完一個Mapper中的語句都會將一級緩存清除。二級緩存

一級緩存作用域太低,如果多個SqlSession需要共享緩存,則就需要開啟二級緩存。二級緩存也叫全局緩存,二級緩存是基于namespace級別的緩存,一個namespace對應(yīng)一個二級緩存。二級緩存需要我們手動開啟。

我們可以通過在 mybatis-config 文件中配置開啟二級緩存。

查詢順序

Mybatis的查詢順序如下圖

Mybatis查詢順序

我們可以根據(jù)上圖大概介紹一下B的流程。

首先創(chuàng)建SqlSession會話查詢一條數(shù)據(jù),這條數(shù)據(jù)就會被放到當(dāng)前會話的一級緩存中。如果當(dāng)前SqlSession去執(zhí)行commit操作(插入,更新,刪除),那么就會清空SqlSession中的一級緩存,保證緩存中始終保存的是最新的數(shù)據(jù),避免臟讀。這個時候并不會把一級緩存更新到二級緩存,這一步操作是在關(guān)閉SqlSession時觸發(fā)的。新會話查詢信息,就會從二級緩存中獲取數(shù)據(jù)。

注意:兩次查詢必須在同一個SqlSession中完成,否則將不會走M(jìn)ybatis的一級緩存

相反,我們在使用Mybatis作為我們的持久層框架時,也就是上圖的A流程

開啟二級緩存后,會使用 CachingExecutor 裝飾 Executor進(jìn)入一級緩存查詢流程前先在CachingExecutor進(jìn)行二級緩存的查詢?nèi)绻壘彺鏇]有命中的話會到一級緩存中查詢最后一級緩存沒有的話才會去與數(shù)據(jù)庫進(jìn)行查詢交互

二級緩存開啟后,同一個 namespace 下的所有操作語句,都影響著同一個 Cache,即二級緩存被多個 SqlSession 共享,是一個全局的變量。

MyBatis 是默認(rèn)關(guān)閉二級緩存的,因?yàn)閷τ谠鰟h改操作頻繁的話,那么二級緩存形同虛設(shè),每次都會被清空緩存。

生命周期

一級緩存沒有過期時間,只有生命周期。MyBatis在開啟一個數(shù)據(jù)庫會話時,會創(chuàng)建一個新的SqlSession對象,SqlSession對象中會有一個Executor對象,Executor對象中持有一個PerpetualCache對象。當(dāng)會話結(jié)束時,SqlSession對象及其內(nèi)部的Executor對象還有PerpetualCache對象也一并釋放掉。

二級緩存有過期時間,但沒有后臺線程進(jìn)行檢測。需要注意的是,并不是key-value的過期時間,而是這個cache的過期時間,是flushInterval,意味著整個清空緩存cache,所以不需要后臺線程去定時檢測。每當(dāng)存取數(shù)據(jù)的時候,都有檢測一下cache的生命時間,默認(rèn)是1小時,如果這個cache存活了一個小時,那么將整個清空一下。

標(biāo)簽: 二級緩存 一級緩存 生命周期

推薦文章

X 關(guān)閉

X 關(guān)閉