您的位置:首頁 >熱點 > 正文

            聊聊Mybatis的緩存-世界信息

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

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


            (資料圖片)

            大家好,我是Leo。

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

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

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

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

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

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

            回歸正題

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

            一級緩存

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

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

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

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

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

            查詢順序

            Mybatis的查詢順序如下圖

            Mybatis查詢順序

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

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

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

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

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

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

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

            生命周期

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

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

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

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

            相關(guān)內(nèi)容

            熱門資訊

            最新圖文