Mybatis 緩存
本章主要介紹 Mybatis 緩存相關內容,主要有緩存策略,一級緩存,二級緩存,以及緩存是否線程安全等
通過閱讀 Mybatis 源碼,發現在二級緩存上使用了以下幾種裝飾器:
FifoCache:先進先出緩存淘汰策略的緩存
LoggingCache:日誌能力的緩存
ScheduledCache:定時清空的緩存
BlockingCache:阻塞式緩存
SerializedCache:序列號能力的緩存
SynchronizedCache:進行同步控制的緩存
從 Mybatis 源碼中發現,Mybatis 二級緩存使用 HashMap 來存儲緩存的數據,那問題來了,二級緩存使用 HashMap 會有併發安全問題嗎?
答案是 不會,因爲使用了 SynchronizedCache 裝飾器。
一級緩存,二級緩存對比圖:
那 Mybatis 緩存是如何存儲的呢?
Mybatis 中涉及到動態 SQL 的原因,緩存項的 key 不能僅僅通過一個 String 來表示,所以通過 CacheKey 來封裝緩存的 key 值
CacheKey 可以封裝多個影響緩存項的因素
判斷 CacheKey 是否相同關鍵是比較兩個對象的 hash 值是否一致
構成 CacheKey 的對象:
1、mapperdStatement 的 id
2、指定查詢結果集的範圍(分頁信息)
3、查詢所使用的 SQL 語句
4、用戶傳遞給 SQL 語句的實際參數值
注:Mybatis 自帶的分頁強烈不建議使用,因爲是將數據全部加載到內存進行分頁,會佔用大量內存空間,已經失去了分頁的意義
CacheKey 判斷是否緩存過的計算四要素:
multiplier:參與 hash 計算的乘數
hashcode:CacheKey 的 hash 值,在 update 函數中實時計算出來的
checksum:校驗和,hash 值的和
count:updateList 中的元素個數
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/HjB3pWkO39yxMdaRbil0cA