您的位置:首頁(yè) >熱點(diǎn) > 正文

聊聊Mybatis的緩存-世界信息

記得點(diǎn)擊"歡少的成長(cháng)之路",設為星標?

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


(資料圖片)

大家好,我是Leo。

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

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

數據庫緩存擴展

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

數據查詢(xún)流程圖

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

回歸正題

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

一級緩存

一級緩存也稱(chēng)為本地緩存(SqlSession),屬于二級緩存的子集。與數據庫同一次會(huì )話(huà)期間查詢(xún)到的數據會(huì )放在本地緩存中。以后如果需要獲取相同的數據,直接從緩存中拿,沒(méi)必要再去查詢(xún)數據庫。

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

使用SESSION,這樣每次執行完一個(gè)Mapper中的語(yǔ)句都會(huì )將一級緩存清除。二級緩存

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

我們可以通過(guò)在 mybatis-config 文件中配置開(kāi)啟二級緩存。

查詢(xún)順序

Mybatis的查詢(xún)順序如下圖

Mybatis查詢(xún)順序

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

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

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

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

開(kāi)啟二級緩存后,會(huì )使用 CachingExecutor 裝飾 Executor進(jìn)入一級緩存查詢(xún)流程前先在CachingExecutor進(jìn)行二級緩存的查詢(xún)如果二級緩存沒(méi)有命中的話(huà)會(huì )到一級緩存中查詢(xún)最后一級緩存沒(méi)有的話(huà)才會(huì )去與數據庫進(jìn)行查詢(xún)交互

二級緩存開(kāi)啟后,同一個(gè) namespace 下的所有操作語(yǔ)句,都影響著(zhù)同一個(gè) Cache,即二級緩存被多個(gè) SqlSession 共享,是一個(gè)全局的變量。

MyBatis 是默認關(guān)閉二級緩存的,因為對于增刪改操作頻繁的話(huà),那么二級緩存形同虛設,每次都會(huì )被清空緩存。

生命周期

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

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

免責聲明:本文不構成任何商業(yè)建議,投資有風(fēng)險,選擇需謹慎!本站發(fā)布的圖文一切為分享交流,傳播正能量,此文不保證數據的準確性,內容僅供參考

關(guān)鍵詞: 二級緩存 一級緩存 生命周期

相關(guān)內容

熱門(mén)資訊

最新圖文

国产福利萌白酱精品一区|国产成人久久精品流白浆|国产一级A级免费视频|久久综合亚洲鲁鲁五月天欧|欧美黑人巨大视频HD