JAVA互聯網架構-Mybatis緩存機制

概述

MyBatis 是一款優(yōu)秀的持久層框架,它支持定制化 SQL、存儲過程以及高級映射。MyBatis 避免了幾乎所有的 JDBC 代碼和手動設置參數以及獲取結果集。MyBatis 可以使用簡單的 XML 或注解來配置和映射原生信息,將接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java對象)映射成數據庫中的記錄。

背景介紹

MyBatis是支持普通 SQL查詢,存儲過程和高級映射的優(yōu)秀持久層框架。MyBatis 消除了幾乎所有的JDBC代碼和參數的手工設置以及結果集的檢索。MyBatis 使用簡單的 XML或注解用于配置和原始映射,將接口和 Java 的POJOs(Plain Ordinary Java Objects,普通的 Java對象)映射成數據庫中的記錄。

每個MyBatis應用程序主要都是使用SqlSessionFactory實例的,一個SqlSessionFactory實例可以通過SqlSessionFactoryBuilder獲得。SqlSessionFactoryBuilder可以從一個xml配置文件或者一個預定義的配置類的實例獲得。

用xml文件構建SqlSessionFactory實例是非常簡單的事情。推薦在這個配置中使用類路徑資源(classpath resource),但你可以使用任何Reader實例,包括用文件路徑或file://開頭的url創(chuàng)建的實例。MyBatis有一個實用類----Resources,它有很多方法,可以方便地從類路徑及其它位置加載資源。

Mybatis緩存機制架構圖

一丶Mybaits一級緩存

mybatis的一級緩存:

MyBatis會在表示會話的SqlSession對象中建立一個簡單的緩存,將每次查詢到的結果結果緩存起來,

當下次查詢的時候,如果判斷先前有個完全一樣的查詢,會直接從緩存中直接將結果取出,返回給用戶,

不需要再進行一次數據庫查詢了。

MyBatis會在一次會話的表示----一個SqlSession對象中創(chuàng)建一個本地緩存(local cache),

對于每一次查詢,都會嘗試根據查詢的條件去本地緩存中查找是否在緩存中,如果在緩存中,

就直接從緩存中取出,然后返回給用戶;否則,從數據庫讀取數據,將查詢結果存入緩存并返回給用戶。

一級緩存是SqlSession級別的緩存。在操作數據庫時需要構造 sqlSession對象,在對象中有一個(內存區(qū)域)數據結構(HashMap)用于存儲緩存數據。不同的sqlSession之間的緩存數據區(qū)域(HashMap)是互相不影響的。

一級緩存的作用域是同一個SqlSession,在同一個sqlSession中兩次執(zhí)行相同的sql語句,第一次執(zhí)行完畢會將數據庫中查詢的數據寫到緩存(內存),第二次會從緩存中獲取數據將不再從數據庫查詢,從而提高查詢效率。當一個sqlSession結束后該sqlSession中的一級緩存也就不存在了。Mybatis默認開啟一級緩存。

二丶一級緩存原理

Mybatis的一級緩存是SqlSession級別的,我們知道每個mapper接口對應一個SqlSession(這樣說應該不準確,應該是一個線程中一個mapper接口對應一個sqlsession),所以Mybatis的一級緩存在不同mapper之間是隔離,相互不影響的。另外在執(zhí)行Add,Update,Del時候,會清空當前線程SqlSession的一級緩存避免臟讀。默認情況下mybaits開啟一級緩存。

Mybaits一級緩存結構圖:

三丶Mybatis二級緩存

二級緩存是mapper級別的緩存,多個SqlSession去操作同一個Mapper的sql語句,多個SqlSession去操作數據庫得到數據會存在二級緩存區(qū)域,多個SqlSession可以共用二級緩存,二級緩存是跨SqlSession的。

二級緩存是多個SqlSession共享的,其作用域是mapper的同一個namespace,不同的sqlSession兩次執(zhí)行相同namespace下的sql語句且向sql中傳遞參數也相同即最終執(zhí)行相同的sql語句,第一次執(zhí)行完畢會將數據庫中查詢的數據寫到緩存(內存),第二次會從緩存中獲取數據將不再從數據庫查詢,從而提高查詢效率。Mybatis默認沒有開啟二級緩存需要在setting全局參數中配置開啟二級緩存。

二級緩存是namespace級別的,這個namespace就是指mapper文件里面那個namepsace,同一個namespace下的搜尋語句共享一個二級緩存。那么二級緩存是怎么樣的構造那,先看下一個圖:

原理

上CachingExecutor的查詢代碼如下:

如果開啟了二級緩存,則先從二級緩存中查找,查找不到則委托為SimpleExecutor查找,而它則會先從一級緩存中查找,查找不到則從數據庫查找。

總結

1、多寫多敲代碼,好的代碼與扎實的基礎知識一定是實踐出來的

2、可以去百度搜索騰訊課堂圖靈學院的直播課程來學習一下java架構實戰(zhàn)案例,還挺不錯的。

3丶Java開發(fā)/架構交流群:658706010我們一起討論技術,一起充電跟比你厲害的人在一起進步會更快哦

最后,每一位讀到這里的網友,感謝你們能耐心地看完。希望在成為一名更優(yōu)秀的Java程序員的道路上,我們可以一起

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容