1. Mybatis的一級快取
Mybatis的一級快取是默認開啟的,你只要搭建一個Mybatis框架,就可以直接使用一級快取,
一級快取是SqlSession級別的,通過SqlSession查詢的資料會被快取,下次使用同一個SqlSession查詢相同的資料,就會從快取中直接獲取,不會從資料庫重新訪問,減輕資料庫壓力,
條件:
- 同一個SqlSession
- 查詢相同的資料
例子:
-
同一個SqlSession查詢相同的資料
這里我們通過員工id查詢員工資訊,且兩次都是查詢
id=1的員工
通過下面的日志資訊可以看到,只執行了一次sql陳述句,但查詢出了兩次員工資訊,
所以說第一次是從資料庫中查詢,第二次是從快取中查詢到的,
-
不同SqlSession查詢相同的資料
使一級快取失效(滿足2個條件,但不從快取中找)的2種情況:
-
同一個SqlSession兩次查詢期間執行了任何一次增刪改操作
-
同一個SqlSession兩次查詢期間手動清空了快取
sqlSession.clearCache();
2. Mybatis的二級快取
二級快取是SqlSessionFactory級別,通過同一個SqlSessionFactory創建的SqlSession查詢的結果會被快取;此后若再次執行相同的查詢陳述句,結果就會從快取中獲取,
二級快取的范圍更大,需要手動開啟,
二級快取開啟的條件:
-
在核心組態檔中,設定全域配置屬性cacheEnabled="true",默認為true,所以不需要自己設定
-
在Mybatis映射檔案中設定標簽:
-
二級快取必須在SqlSession關倍訓提交之后有效
原因:第一次查詢資料只保存在一級快取中,只有在SqlSession操作完畢(關倍訓提交)后,一級快取中的資料才保存到二級快取中,
這時候運行代碼會報一個沒有序列化的例外:
-
查詢的資料所轉換的物體型別別必須實作序列化的介面
二級快取失效的情況:
- 兩次查詢之間執行了任意的增刪改,會使一級和二級快取同時失效
3. 二級快取的相關配置
在mapper組態檔中添加的cache標簽可以設定一些屬性:
-
eviction屬性:快取回收策略,默認的是 LRU,
- LRU(Least Recently Used):最近最少使用的:移除最長時間不被使用的物件,
- FIFO(First in First out):先進先出:按物件進入快取的順序來移除它們,
- SOFT:軟參考,移除基于垃圾回收器狀態和軟參考規則的物件
- WEAK : 弱參考,更積極地移除基于垃圾收集器狀態和弱參考規則的物件
-
flushInterval屬性:重繪間隔,單位毫秒
默認情況是不設定,也就是沒有重繪間隔,快取僅僅呼叫陳述句時重繪 -
size屬性:參考數目,正整數,一般不去設定它,用默認的就行
代表快取最多可以存盤多少個物件,太大容易導致記憶體溢位 -
readOnly屬性:只讀, true/false
- true:只讀快取;會給所有呼叫者回傳快取物件的相同實體,這些物件不能被修改,這提供了 很重要的性能優勢,
- false:讀寫快取;會回傳快取物件的拷貝(通過序列化),這會慢一些,但是安全,因此默認是false,
4. MyBatis快取查詢的順序
-
先查詢二級快取,因為二級快取中可能會有其他程式已經查出來的資料,可以拿來直接使用,
-
如果二級快取沒有命中,再查詢一級快取
有小伙伴可能就要說了,二級快取的范圍更大,二級中包括了一級,二級中都沒有,一級中肯定也沒有啊???
不一定,一級快取只有關倍訓提交后才保存到二級快取,所以二級快取中可能也沒有某些一級快取,
-
如果一級快取也沒有命中,則查詢資料庫
5. 總結
部分內容來自 B站尚硅谷課程 ,老師講得很好,有興趣的可以聽聽,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/502372.html
標籤:Java
上一篇:spring原始碼學習筆記1——決議xml生成BeanDefinition的程序決議
下一篇:day23--Java集合06
