pytest -mark標記
阿新 • • 發佈:2022-03-29
簡介
MyBatis 包含一個非常強大的查詢快取特性,它可以非 常方便地配置和定製。快取可以極大的提升查詢效率。
MyBatis 系統中預設定義了兩級快取,也就是一級快取和二級快取:
- 預設情況下,只有一級快取(SqlSession 級別的快取,也稱為本地快取)開啟。
- 二級快取需要手動開啟和配置,它是基於 namespace 級別的快取。
- 為了挺高擴充套件性,MyBatis 定義了快取介面 Cache。我們可以通過實現 Cache 介面來自定義二級快取。
一級快取
一級快取(local cache), 即本地快取, 作用域預設 為sqlSession。當 Session flush 或 close 後, 該 Session 中的所有 Cache 將被清空。
本地快取不能被關閉, 但可以呼叫 clearCache() 來清空本地快取, 或者改變快取的作用域。
在mybatis3.1之後,可以配置本地快取的作用域, 在 mybatis.xml 中配置。
案例演示
同一次會話期間只要查詢過的資料都會儲存在當 前SqlSession的一個Map中:
key:hashCode + 查詢的 SqlId + 編寫的sql查詢語句 + 引數
一級快取失效
- sqlSession 不同。
- sqlSession 相同,查詢條件不同。
- sqlSession 相同,但是查詢期間執行了增刪改操作。
- sqlSession 相同,手動清除了一級快取(快取清空)。
二級快取
二級快取(second level cache),全域性作用域快取,基於 namespace 級別的快取;一個 namespace 對應一個二級快取;
工作機制
- 一個會話,查詢一條資料,這個資料就會被放到當前會話的一級快取中;
- 如果會話關閉;那麼一級快取中的資料會被儲存到二級快取中;新的會話查詢資訊,就可以參照二級快取。
- 不同 namespace 查出的資料會放在自己對應的快取 map 中。
使用步驟
-
開啟全域性二級快取配置:
<setting name="cacheEnabled" value="true"/>
-
去 mapper.xml 中配置使用二級快取:
<!-- size:快取存放多少元素; type="":指定自定義快取的全類名; 實現Cache介面即可; --> <!-- <cache eviction="FIFO" flushInterval="60000" readOnly="false" size="1024"></cache> -->
- eviction(快取的回收策略):
- LRU – 最近最少使用的:移除最長時間不被使用的物件。
- FIFO – 先進先出:按物件進入快取的順序來移除它們。
- SOFT – 軟引用:移除基於垃圾回收器狀態和軟引用規則的物件。
- WEAK – 弱引用:更積極地移除基於垃圾收集器狀態和弱引用規則的物件。
- 預設的是 LRU。
- flushInterval(快取重新整理間隔):
- 快取多長時間清空一次,預設不清空,設定一個毫秒值
- readOnly(是否只讀):
- true(只讀):
- mybatis認為所有從快取中獲取資料的操作都是隻讀操作,不會修改資料。
- mybatis為了加快獲取速度,直接就會將資料在快取中的引用交給使用者。不安全,速度快
- false(非只讀):
- mybatis覺得獲取的資料可能會被修改。
- mybatis會利用序列化&反序列的技術克隆一份新的資料給你。安全,速度慢
- true(只讀):
- eviction(快取的回收策略):
-
pojo 類需要實現序列化介面;
快取相關的配置
- cacheEnabled=true:false:關閉快取(二級快取關閉)(一級快取一直可用的)
- 每個select標籤都有 useCache="true":
- false:不使用快取(一級快取依然使用,二級快取不使用)
- 【每個增刪改標籤的:flushCache="true":(一級二級都會清除)】
- 增刪改執行完成後就會清楚快取;
- 測試:flushCache="true":一級快取就清空了;二級也會被清除;
- 查詢標籤:flushCache="false";
- 如果 flushCache=true;每次查詢之後都會清空快取;快取是沒有被使用的;
- sqlSession.clearCache();只是清楚當前session的一級快取;
- localCacheScope:本地快取作用域:(一級快取SESSION);當前會話的所有資料儲存在會話快取中;
STATEMENT:可以禁用一級快取;