上一篇我們學習了一級快取,這次我們來學習二級快取,
一、什么是二級快取
二級快取也叫全域快取,是namespace級別的快取,每一個命名空間對應一個二級快取,
二、二級快取的作業機制
1.每個SqlSession對應一個一級快取,
2.當SqlSession關閉時,對應的一級快取就會消失,但是如果我們開啟了二級快取,一級快取的內容就會在會話關閉時存入對應的二級快取中,
3.此時新的SqlSession會話就可以從二級快取中獲取內容,
三、二級快取的具體應用
1.mybatis-config.xml核心檔案配置
<settings> <setting name="cacheEnabled" value="true"/> </settings>
這個配置不是必要的,因為官方檔案中說明這個配置是默認開啟的,
| 設定名 | 描述 | 有效值 | 默認值 |
|---|---|---|---|
| cacheEnabled | 全域性地開啟或關閉所有映射器組態檔中已配置的任何快取, | true | false | true |
2.Mapper.xml配置
<cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true"/>
這是官方給出的一個二級快取的例子,這個更高級的配置創建了一個 FIFO 快取,每隔 60 秒重繪,最多可以存盤結果物件或串列的 512 個參考,而且回傳的物件被認為是只讀的,因此對它們進行修改可能會在不同執行緒中的呼叫者產生沖突,
可用的清除策略有:
- LRU – 最近最少使用:移除最長時間不被使用的物件,
- FIFO – 先進先出:按物件進入快取的順序來移除它們,
- SOFT – 軟參考:基于垃圾回收器狀態和軟參考規則移除物件,
- WEAK – 弱參考:更積極地基于垃圾收集器狀態和弱參考規則移除物件,
默認的清除策略是 LRU,
flushInterval(重繪間隔)屬性可以被設定為任意的正整數,設定的值應該是一個以毫秒為單位的合理時間量, 默認情況是不設定,也就是沒有重繪間隔,快取僅僅會在呼叫陳述句時重繪,
size(參考數目)屬性可以被設定為任意正整數,要注意欲快取物件的大小和運行環境中可用的記憶體資源,默認值是 1024,
readOnly(只讀)屬性可以被設定為 true 或 false,只讀的快取會給所有呼叫者回傳快取物件的相同實體, 因此這些物件不能被修改,這就提供了可觀的性能提升,而可讀寫的快取會(通過序列化)回傳快取物件的拷貝, 速度上會慢一些,但是更安全,因此默認值是 false,
3.測驗
@Test public void getUserById() { SqlSession sqlSession = MyBatisUtil.getSqlSession(); UserMapper userMapper = sqlSession.getMapper(UserMapper.class); User user = userMapper.getUserById(10001); System.out.println(user); sqlSession.close(); System.out.println("========================================="); SqlSession sqlSession2 = MyBatisUtil.getSqlSession(); UserMapper userMapper2 = sqlSession2.getMapper(UserMapper.class); User user2 = userMapper2.getUserById(10001); System.out.println(user2); sqlSession2.close(); }
測驗結果如下:

可以看見第二次查詢并沒有操作資料庫,
當然我們也可以直接使用最簡單的二級快取配置:
<cache/>
此時我們去測驗,結果報錯:

報的錯誤是User類沒有序列化,那么為什么會出現這個問題呢?
官方檔案有這樣一句說明:
readOnly(只讀)屬性可以被設定為 true 或 false,只讀的快取會給所有呼叫者回傳快取物件的相同實體, 因此這些物件不能被修改,這就提供了可觀的性能提升,而可讀寫的快取會(通過序列化)回傳快取物件的拷貝, 速度上會慢一些,但是更安全,因此默認值是 false,
所以我們需要讓JavaBean序列化,也就是實作Serializable介面,
我們去實作Serializable介面:
public class User implements Serializable {}
此時再次測驗:

沒有問題,
(本文僅作個人學習記錄用,如有紕漏敬請指正)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/508975.html
標籤:Java
上一篇:Git (簡單基本操作)
下一篇:JAVA設計模式-工廠模式
