一個作業了 5年的程式員,在私信里面不斷向我訴苦,
他說,他用了Mybatis這么久,怎么滴也算是精通Mybatis了吧,
結果竟然在Mybatis這個面試題上翻車了! 真的好煩!
好吧,我們今天來看看“Mybatis里面的快取機制”,普通人和高手的回答,
普通人:
嗯,,,,,,,,,
高手:
這個問題,有點復雜,我打算從幾個方面來說明,
首先,Mybatis里面設計了二級快取來提升資料的檢索效率,避免每次資料的訪問都需要去查詢資料庫,

一級快取,是SqlSession級別的快取,也叫本地快取,因為每個用戶在執行查詢的時候都需要使用SqlSession來執行,
為了避免每次都去查資料庫,Mybatis把查詢出來的資料保存到SqlSession的本地快取中,后續的SQL如果命中快取,就可以直接從本地快取讀取了,
如果想要實作跨SqlSession級別的快取?那么一級快取就無法實作了,因此在Mybatis里面引入了二級快取,就是當多個用戶
在查詢資料的時候,只有有任何一個SqlSession拿到了資料就會放入到二級快取里面,其他的SqlSession就可以從二級快取加載資料,
每個一級快取的具體實作原理是:

在SqlSession 里面持有一個Executor,每個Executor中有一個LocalCache物件,
當用戶發起查詢的時候,Mybatis會根據執行陳述句在Local Cache里面查詢,如果沒命中,再去查詢資料庫并寫入到LocalCache,否則直接回傳,
所以,以及快取的生命周期是SqlSessiion,而且在多個Sqlsession或者分布式環境下,可能會導致資料庫寫操作出現臟資料,
二級快取的具體實作原理是:

使用CachingExecutor裝飾了Executor,所以在進入一級快取的查詢流程之前,會先通過CachingExecutor進行二級快取的查詢,
開啟二級快取以后,會被多個SqlSession共享,所以它是一個全域快取,因此它的查詢流程是先查二級快取,再查一級快取,最后再查資料庫,
另外,MyBatis 的二級快取相對于一級快取來說,實作了 SqlSession 之間快取資料的共享,同時快取粒度也能夠到 namespace 級別,并且還可以通過 Cache 介面實作類不同的組合,對 Cache 的可控性也更強,
以上就是我對這個問題的理解,
總結
在實際業務場景中,多級快取的設計思想,非常值得我們學習和借鑒,
所以我認為這個面試題很不錯,
大家要牢記,學習底層技術的目的是為了提高技術思維能力和積累解決方案,為以后更高的職位做好鋪墊,
本期的普通人VS高手面試系列就到這里結束了,
有任何不懂的技術面試題,歡迎隨時私信我
著作權宣告:本博客所有文章除特別宣告外,均采用 CC BY-NC-SA 4.0 許可協議,轉載請注明來自
Mic帶你學架構!
如果本篇文章對您有幫助,還請幫忙點個關注和贊,您的堅持是我不斷創作的動力,歡迎關注「跟著Mic學架構」公眾號公眾號獲取更多技術干貨!

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/471745.html
標籤:Java
