建設(shè)工程施工合同條例湖北搜索引擎優(yōu)化
文章目錄
- MyBatis緩存的區(qū)別是什么
- 作用范圍方面有哪些差異
- 生命周期
- 數(shù)據(jù)進行了存儲
- 緩存的優(yōu)缺點
MyBatis緩存的區(qū)別是什么
MyBatis 提供了一級緩存和二級緩存,這兩者的主要區(qū)別在于其作用范圍和生命周期。
- 一級緩存:一級緩存是 SqlSession 級別的緩存。當(dāng)我們執(zhí)行查詢時,它就會將查詢結(jié)果緩存起來。當(dāng)我們再次查詢相同的數(shù)據(jù),它就會直接從緩存中拉取。一級緩存是默認開啟的。一級緩存的生命周期和 SqlSession 保持一致,當(dāng) SqlSession 被關(guān)閉或者清空,那么一級緩存就會消失
- 二級緩存:二級緩存是命名空間級別的緩存。一個命名空間可以理解為一個 Mapper 文件,即一個 XML 文件。不同的 Mapper 文件可以有不同的命名空間,即使它們都在同一個項目中。二級緩存是可以被多個 SqlSession 共享的。它的生命周期和應(yīng)用程序保持一致,即應(yīng)用程序運行期間,二級緩存一直存在。當(dāng)應(yīng)用程序關(guān)閉后,二級緩存才會消失
注意:使用二級緩存時,需要注意其適用場景。如果數(shù)據(jù)更新非常頻繁,那么使用二級緩存可能不太合適,因為數(shù)據(jù)即使被更新,緩存中的數(shù)據(jù)也不會被立即清除,而是等待應(yīng)用程序關(guān)閉后才會消失。這可能會導(dǎo)致數(shù)據(jù)不一致的問題。
作用范圍方面有哪些差異
MyBatis的一級緩存和二級緩存的作用范圍有明顯的差異。
- 一級緩存是SqlSession級別的緩存,它的作用范圍僅限于當(dāng)前的SqlSession。也就是說,只有同一個SqlSession在執(zhí)行兩次相同的sql時,第一次得到的數(shù)據(jù)才會被緩存起來,第二次執(zhí)行時直接從緩存中獲取,提高效率。
- 而二級緩存是基于mapper的namespace作用域,但多個SqlSession操作同一個namespace下的sql時,只要傳入的參數(shù)相同,執(zhí)行相同的sql語句,第一次執(zhí)行完畢后,會自動將sql提交并將數(shù)據(jù)緩存起來。也就是說,二級緩存在多個SqlSession之間共享數(shù)據(jù),作用范圍更廣。
- 以上內(nèi)容僅供參考,以MyBatis官方文檔為準(zhǔn)確 。
生命周期
MyBatis的緩存生命周期主要涉及到一級緩存和二級緩存。
- 一級緩存的生命周期和SqlSession保持一致。當(dāng)開啟一個新的數(shù)據(jù)庫會話時,MyBatis會創(chuàng)建一個新的SqlSession對象,其中包含一個用于保存緩存數(shù)據(jù)的hashMap(以對象的id作為key,對象作為value保存)。當(dāng)SqlSession執(zhí)行DML(insert,update,delete)操作并提交到數(shù)據(jù)庫時,MyBatis會清空SqlSession的一級緩存,以保存最新的數(shù)據(jù)并避免臟讀現(xiàn)象。如果SqlSession調(diào)用close()方法或者clearCache()方法,一級緩存中的數(shù)據(jù)會被釋放或者清空。
- 二級緩存的生命周期和應(yīng)用程序保持一致,即應(yīng)用程序運行期間,二級緩存一直存在。二級緩存是mapper級別的緩存,使用二級緩存時,多個SqlSession使用同一個mapper的sql語句去操作數(shù)據(jù)庫,得到的數(shù)據(jù)存在二級緩存區(qū)域。二級緩存的范圍更大,多個SqlSession可以共用二級緩存
以MyBatis官方文檔為準(zhǔn)確
數(shù)據(jù)進行了存儲
MyBatis的一級緩存和二級緩存存儲的數(shù)據(jù)主要是查詢結(jié)果的對象。
- 具體來說,一級緩存存儲的是單個SqlSession中查詢的數(shù)據(jù),當(dāng)同一個SqlSession再次查詢相同的數(shù)據(jù)時,可以直接從緩存中獲取,避免了重復(fù)的數(shù)據(jù)庫查詢操作,提高了效率。
- 而二級緩存存儲的是多個SqlSession之間共享的數(shù)據(jù),當(dāng)多個SqlSession查詢相同的namespace下的數(shù)據(jù)時,只要傳入的參數(shù)相同,執(zhí)行相同的sql語句,第一次執(zhí)行完畢后,會自動將sql提交并將數(shù)據(jù)緩存起來,供其他SqlSession使用,避免了重復(fù)的數(shù)據(jù)庫查詢操作,提高了效率。
- 需要注意的是,MyBatis的二級緩存只會緩存查詢語句,而不會緩存更新、插入、刪除等語句。同時,MyBatis的二級緩存是將查詢結(jié)果對象序列化后存儲在硬盤上,讀取時需要進行反序列化操作,因此在選擇二級緩存時需要考慮到序列化和反序列化的開銷。
緩存的優(yōu)缺點
MyBatis 的一級緩存和二級緩存都有其優(yōu)缺點
- 優(yōu)點
- 一級緩存
- 減少讀數(shù)據(jù)庫的讀操作,降低數(shù)據(jù)庫壓力,加快響應(yīng)速度
- 二級緩存
- 實現(xiàn)了緩存數(shù)據(jù)的共享,可控性也更強
- 一級緩存
- 缺點
- 一級緩存
- 可能造成數(shù)據(jù)不一致問題
- 增加成本
- 二級緩存
- 極大可能會出現(xiàn)錯誤數(shù)據(jù)
- 安全使用的條件比較苛刻
- 一級緩存
MyBatis 的一級緩存和二級緩存都有其各自的優(yōu)缺點。在選擇使用緩存時,需要根據(jù)具體的應(yīng)用場景和需求權(quán)衡這些優(yōu)缺點,以做出最佳的選擇。