Mybatis-09-快取
阿新 • • 發佈:2020-08-14
快取
-
什麼是快取[Cache]?
- 存在記憶體中的臨時資料
- 提高查詢效率,解決高併發的效能問題
-
為什麼使用快取?
- 減少和資料庫的互動次數,減少系統開銷,提高系統效率
-
什麼樣的資料能使用快取?
- 經常查詢且不常改變的資料
1 Mybatis快取
- 可以定製和配置快取。
- 預設定義了兩極快取:一級快取和二級快取
- 預設情況下,只有一級快取開啟(SqlSession級別的快取)
- 二級快取需要手動開啟和配置,是基於namespace級別的快取
- 為了提高擴充套件性,Mybatis定義了快取介面Cache。
2 一級快取
也叫本地快取:
- 與資料庫同一次會話期間查詢到的資料會放到本地快取中
- 以後如果需要可以直接從快取拿;
測試步驟:
- 開啟日誌
- 測試在一個session中查詢兩次相同的記錄
- 檢視日誌輸出
快取失效的情況:
-
查詢不同的東西
-
增刪改操作,可能會改變原來的資料,必定會重新整理快取;
-
查詢不同的Mapper.xml
-
手動清理快取!
sqlSession.closeCache();
小結:
一級快取預設是開啟的,只在一次SqlSession中有效。
一級快取就是一個Map
3 二級快取
- 二級快取也叫全域性快取
- 基於namespace級別的快取,一個名稱空間,對應一個二級快取;
- 工作機制
- 一個會話查詢一條資料,這個資料被放在一級快取中;
- 會話關閉時,一級快取被清理,我們希望繪畫關閉時,一級快取的資料被儲存到二級快取;
- 新的會話查詢資訊,可以從二級快取中獲取內容;
- 不同的mapper查出的資料會放在自己的快取(map)中;
步驟:
- 開啟全域性快取
<setting name="cacheEnabled" value="true"/>
- 在要使用二級快取的Mapper中開啟
<cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true"/>
-
測試
- 問題:我們需要將實體類序列化;
小結:
- 只要開啟了二級快取,在同一個mapper有效
- 所有資料會先放在一級快取;
- 只有會話提交或關閉時,才會提交到二級快取!
4 快取原理
5 自定義快取-ehcache
Ehcache是一種廣泛使用的開源Java分散式快取
第一步,先導包!
<!-- https://mvnrepository.com/artifact/org.mybatis.caches/mybatis-ehcache -->
<dependency>
<groupId>org.mybatis.caches</groupId>
<artifactId>mybatis-ehcache</artifactId>
<version>1.1.0</version>
</dependency>
第二步,應用到Mapper的cache標籤中。
<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>