記得點擊"歡少的成長之路",設為星標?
后臺點擊【聯系我】,申請加入優質技術學習社群
(資料圖片)
大家好,我是Leo。
好久沒有輸出技術理論了,實在是忙。最近主要以設計系統為主了。面試剛好又倒在了Mybatis原理。今天來聊一下Mybatis的一級緩存,二級緩存。
Mybatis緩存是內存中的數據,主要是對數據庫查詢結果的保存,使用緩存的好處是避免頻繁與數據庫進行交互,提升查詢的響應速度。
數據庫緩存擴展聊到Mybatis緩存。我們可以擴展聊一下MySQL緩存。MySQL緩存其實與Mybatis類似,在查詢的時候都會先通過查詢緩存檢查一下所需的數據是否存在緩存中,如果存在緩存的話就會直接返回,這樣就達到了避免頻繁與數據庫進行交互的目的。
數據查詢流程圖
回歸正題在學習過程中,希望大家把知識點串起來學習,這樣有助力更好的學習與理解
Mybatis 緩存主要分一級緩存和二級緩存。
一級緩存一級緩存也稱為本地緩存(SqlSession),屬于二級緩存的子集。與數據庫同一次會話期間查詢到的數據會放在本地緩存中。以后如果需要獲取相同的數據,直接從緩存中拿,沒必要再去查詢數據庫。
一級緩存的緩存數據只在SqlSession內有效,它的范圍有兩種SESSION和STATEMENT,默認是SESSION。如果不想使用一級緩存,可以通過下列代碼配置
使用SESSION,這樣每次執行完一個Mapper中的語句都會將一級緩存清除。二級緩存
一級緩存作用域太低,如果多個SqlSession需要共享緩存,則就需要開啟二級緩存。二級緩存也叫全局緩存,二級緩存是基于namespace級別的緩存,一個namespace對應一個二級緩存。二級緩存需要我們手動開啟。
我們可以通過在 mybatis-config 文件中配置開啟二級緩存。
查詢順序
Mybatis的查詢順序如下圖
Mybatis查詢順序
我們可以根據上圖大概介紹一下B的流程。
首先創建SqlSession會話查詢一條數據,這條數據就會被放到當前會話的一級緩存中。如果當前SqlSession去執行commit操作(插入,更新,刪除),那么就會清空SqlSession中的一級緩存,保證緩存中始終保存的是最新的數據,避免臟讀。這個時候并不會把一級緩存更新到二級緩存,這一步操作是在關閉SqlSession時觸發的。新會話查詢信息,就會從二級緩存中獲取數據。注意:兩次查詢必須在同一個SqlSession中完成,否則將不會走Mybatis的一級緩存
相反,我們在使用Mybatis作為我們的持久層框架時,也就是上圖的A流程
開啟二級緩存后,會使用 CachingExecutor 裝飾 Executor進入一級緩存查詢流程前先在CachingExecutor進行二級緩存的查詢如果二級緩存沒有命中的話會到一級緩存中查詢最后一級緩存沒有的話才會去與數據庫進行查詢交互生命周期二級緩存開啟后,同一個 namespace 下的所有操作語句,都影響著同一個 Cache,即二級緩存被多個 SqlSession 共享,是一個全局的變量。
MyBatis 是默認關閉二級緩存的,因為對于增刪改操作頻繁的話,那么二級緩存形同虛設,每次都會被清空緩存。
一級緩存沒有過期時間,只有生命周期。MyBatis在開啟一個數據庫會話時,會創建一個新的SqlSession對象,SqlSession對象中會有一個Executor對象,Executor對象中持有一個PerpetualCache對象。當會話結束時,SqlSession對象及其內部的Executor對象還有PerpetualCache對象也一并釋放掉。
二級緩存有過期時間,但沒有后臺線程進行檢測。需要注意的是,并不是key-value的過期時間,而是這個cache的過期時間,是flushInterval,意味著整個清空緩存cache,所以不需要后臺線程去定時檢測。每當存取數據的時候,都有檢測一下cache的生命時間,默認是1小時,如果這個cache存活了一個小時,那么將整個清空一下。
免責聲明:本文不構成任何商業建議,投資有風險,選擇需謹慎!本站發布的圖文一切為分享交流,傳播正能量,此文不保證數據的準確性,內容僅供參考