【面試普通人VS高手系列】說一說Mybatis裡面的緩存機制

来源:https://www.cnblogs.com/mic112/archive/2022/05/09/16249434.html
-Advertisement-
Play Games

一個工作了 5年的程式員,在私信裡面不斷向我訴苦。 他說,他用了Mybatis這麼久,怎麼滴也算是精通Mybatis了吧。 結果竟然在Mybatis這個面試題上翻車了! 真的好煩! 好吧,我們今天來看看“Mybatis裡面的緩存機制”,普通人和高手的回答。 普通人: 嗯。。。。。。。。。 高手: 這 ...


一個工作了 5年的程式員,在私信裡面不斷向我訴苦。

他說,他用了Mybatis這麼久,怎麼滴也算是精通Mybatis了吧。

結果竟然在Mybatis這個面試題上翻車了! 真的好煩!

好吧,我們今天來看看“Mybatis裡面的緩存機制”,普通人和高手的回答。

普通人:

嗯。。。。。。。。。

高手:

這個問題,有點複雜,我打算從幾個方面來說明。

首先,Mybatis裡面設計了二級緩存來提升數據的檢索效率,避免每次數據的訪問都需要去查詢資料庫。

image-20220411223435810

一級緩存,是SqlSession級別的緩存,也叫本地緩存,因為每個用戶在執行查詢的時候都需要使用SqlSession來執行,

為了避免每次都去查資料庫,Mybatis把查詢出來的數據保存到SqlSession的本地緩存中,後續的SQL如果命中緩存,就可以直接從本地緩存讀取了。

如果想要實現跨SqlSession級別的緩存?那麼一級緩存就無法實現了,因此在Mybatis裡面引入了二級緩存,就是當多個用戶

在查詢數據的時候,只有有任何一個SqlSession拿到了數據就會放入到二級緩存裡面,其他的SqlSession就可以從二級緩存載入數據。

每個一級緩存的具體實現原理是:

image-20220411224117473

在SqlSession 裡面持有一個Executor,每個Executor中有一個LocalCache對象。

當用戶發起查詢的時候,Mybatis會根據執行語句在Local Cache裡面查詢,如果沒命中,再去查詢資料庫並寫入到LocalCache,否則直接返回。

所以,以及緩存的生命周期是SqlSessiion,而且在多個Sqlsession或者分散式環境下,可能會導致資料庫寫操作出現臟數據。

二級緩存的具體實現原理是:

image-20220411224448255

使用CachingExecutor裝飾了Executor,所以在進入一級緩存的查詢流程之前,會先通過CachingExecutor進行二級緩存的查詢。

開啟二級緩存以後,會被多個SqlSession共用,所以它是一個全局緩存。因此它的查詢流程是先查二級緩存,再查一級緩存,最後再查資料庫。

另外,MyBatis 的二級緩存相對於一級緩存來說,實現了 SqlSession 之間緩存數據的共用,同時緩存粒度也能夠到 namespace 級別,並且還可以通過 Cache 介面實現類不同的組合,對 Cache 的可控性也更強。

以上就是我對這個問題的理解。

總結

在實際業務場景中,多級緩存的設計思想,非常值得我們學習和借鑒。

所以我認為這個面試題很不錯。

大家要牢記,學習底層技術的目的是為了提高技術思維能力和積累解決方案,為以後更高的職位做好鋪墊。

本期的普通人VS高手面試系列就到這裡結束了。

有任何不懂的技術面試題,歡迎隨時私信我

file

版權聲明:本博客所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 Mic帶你學架構
如果本篇文章對您有幫助,還請幫忙點個關註和贊,您的堅持是我不斷創作的動力。歡迎關註「跟著Mic學架構」公眾號公眾號獲取更多技術乾貨!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
一周排行
    -Advertisement-
    Play Games
  • 1. 說明 /* Performs operations on System.String instances that contain file or directory path information. These operations are performed in a cross-pla ...
  • 視頻地址:【WebApi+Vue3從0到1搭建《許可權管理系統》系列視頻:搭建JWT系統鑒權-嗶哩嗶哩】 https://b23.tv/R6cOcDO qq群:801913255 一、在appsettings.json中設置鑒權屬性 /*jwt鑒權*/ "JwtSetting": { "Issuer" ...
  • 引言 集成測試可在包含應用支持基礎結構(如資料庫、文件系統和網路)的級別上確保應用組件功能正常。 ASP.NET Core 通過將單元測試框架與測試 Web 主機和記憶體中測試伺服器結合使用來支持集成測試。 簡介 集成測試與單元測試相比,能夠在更廣泛的級別上評估應用的組件,確認多個組件一起工作以生成預 ...
  • 在.NET Emit編程中,我們探討了運算操作指令的重要性和應用。這些指令包括各種數學運算、位操作和比較操作,能夠在動態生成的代碼中實現對數據的處理和操作。通過這些指令,開發人員可以靈活地進行算術運算、邏輯運算和比較操作,從而實現各種複雜的演算法和邏輯......本篇之後,將進入第七部分:實戰項目 ...
  • 前言 多表頭表格是一個常見的業務需求,然而WPF中卻沒有預設實現這個功能,得益於WPF強大的控制項模板設計,我們可以通過修改控制項模板的方式自己實現它。 一、需求分析 下圖為一個典型的統計表格,統計1-12月的數據。 此時我們有一個需求,需要將月份按季度劃分,以便能夠直觀地看到季度統計數據,以下為該需求 ...
  • 如何將 ASP.NET Core MVC 項目的視圖分離到另一個項目 在當下這個年代 SPA 已是主流,人們早已忘記了 MVC 以及 Razor 的故事。但是在某些場景下 SSR 還是有意想不到效果。比如某些靜態頁面,比如追求首屏載入速度的時候。最近在項目中回歸傳統效果還是不錯。 有的時候我們希望將 ...
  • System.AggregateException: 發生一個或多個錯誤。 > Microsoft.WebTools.Shared.Exceptions.WebToolsException: 生成失敗。檢查輸出視窗瞭解更多詳細信息。 內部異常堆棧跟蹤的結尾 > (內部異常 #0) Microsoft ...
  • 引言 在上一章節我們實戰了在Asp.Net Core中的項目實戰,這一章節講解一下如何測試Asp.Net Core的中間件。 TestServer 還記得我們在集成測試中提供的TestServer嗎? TestServer 是由 Microsoft.AspNetCore.TestHost 包提供的。 ...
  • 在發現結果為真的WHEN子句時,CASE表達式的真假值判斷會終止,剩餘的WHEN子句會被忽略: CASE WHEN col_1 IN ('a', 'b') THEN '第一' WHEN col_1 IN ('a') THEN '第二' ELSE '其他' END 註意: 統一各分支返回的數據類型. ...
  • 在C#編程世界中,語法的精妙之處往往體現在那些看似微小卻極具影響力的符號與結構之中。其中,“_ =” 這一組合突然出現還真不知道什麼意思。本文將深入剖析“_ =” 的含義、工作原理及其在實際編程中的廣泛應用,揭示其作為C#語法奇兵的重要角色。 一、下劃線 _:神秘的棄元符號 下劃線 _ 在C#中並非 ...