快取
1、簡介
- 什么是快取(cache)
- 存在記憶體中的臨時資料
- 將用戶經常查詢的資料放在快取中,就不用每次查詢都連接資料庫,提高查詢效率,解決高并發系統的問題
- 為什么使用快取
- 減少與資料庫的互動次數,減少系統開銷,提高系統效率
- 什么樣的資料使用快取
- 經常查詢且不經常改變的資料
2、Mybatis快取
- Mybatis系統中默認定義了兩級快取:一級快取和二級快取
- 默認情況下,只有一級快取,(SQLSession級別的快取,也叫本地快取)
- 二級快取需要手動開啟和配置,基于namespace級別的快取
- Mybatis中定義了快取介面Cache,提高了拓展性,通過實作Cache介面來自定義二級快取
3、一級快取
一級快取,也叫本地快取:SqlSession
- 于資料庫同一次會話期間查詢到的資料會放在本地快取中
- SqlSession未關閉前如要獲取相同的資料,直接從快取中去,不用再去查詢資料庫
快取失效的情況:
- 查詢不同的資料
- 增刪改操作,可能會改變原來的資料,所以必定會重繪快取
- 查詢不同的Mapper.xml
- 手動清理快取
4、二級快取
- 二級快取也叫全域快取
- 基于namespace快取,一個名稱空間,對應一個二級快取
- 作業機制
- 一個會話查詢一條資料,資料被保存在當前會話的一級快取中;
- 當前會話被關閉時,一級快取失效,一級快取中的資料被保存到二級快取中;
- 新的會話查詢資訊,就可以從二級快取中獲取內容;
- 不同的Mapper查詢的資料放在自己對應的快取(map)中;
步驟:
-
開啟全域快取
<!--開啟全域快取(二級快取)--> <setting name="cacheEnabled" value=https://www.cnblogs.com/spang/p/"true"/> -
在要使用二級快取的Mapper中開啟
<!--在當前Mapper.xml開啟二級快取--> <cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true"/>創建了一個 FIFO 快取;每隔 60 秒重繪;最多可以存盤結果物件或串列的 512 個參考;回傳的物件被認為是只讀的
可用的清除策略有:
LRU– 最近最少使用:移除最長時間不被使用的物件,FIFO– 先進先出:按物件進入快取的順序來移除它們,SOFT– 軟參考:基于垃圾回收器狀態和軟參考規則移除物件,WEAK– 弱參考:更積極地基于垃圾收集器狀態和弱參考規則移除物件,
默認的清除策略是 LRU,
-
測驗
-
問題:
java.io.NotSerializableException: com.spong.pojo.Student開啟二級快取時,需要放入快取的物體類實作序列化
需要將物體類序列化,物體類需要實作介面Serializable;
public class User implements Serializable {...}
-
小結:
- 所有的資料都會先放在一級快取中
- 只有當會話提交,或者關閉時,才會提交到二級快取中
- 只要開啟了二級快取,在同一個Mapper下就有效
5、快取原理

如有錯誤,歡迎大佬指正!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/88041.html
標籤:Java
