美乳丰满人妻无码视频免费_国产成人亚洲影院在线_成在人线AV无码免费可以下载_国产乱子伦精品无码专区_日本内射

首頁> 資訊> 詳情

聊聊Mybatis的緩存

2023-01-10 12:04:48 來源:程序員客棧

記得點擊"歡少的成長之路",設為星標?

后臺點擊【聯(lián)系我】,申請加入優(yōu)質技術學習社群


(資料圖片僅供參考)

大家好,我是Leo。

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

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

數(shù)據庫緩存擴展

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

數(shù)據查詢流程圖

在學習過程中,希望大家把知識點串起來學習,這樣有助力更好的學習與理解

回歸正題

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

一級緩存

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

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

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

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

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

查詢順序

Mybatis的查詢順序如下圖

Mybatis查詢順序

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

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

注意:兩次查詢必須在同一個SqlSession中完成,否則將不會走Mybatis的一級緩存

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

開啟二級緩存后,會使用 CachingExecutor 裝飾 Executor進入一級緩存查詢流程前先在CachingExecutor進行二級緩存的查詢如果二級緩存沒有命中的話會到一級緩存中查詢最后一級緩存沒有的話才會去與數(shù)據庫進行查詢交互

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

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

生命周期

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

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

關鍵詞: 二級緩存 一級緩存 生命周期

上一篇:
下一篇: