Mybatis 緩存

本章主要介紹 Mybatis 緩存相關內容,主要有緩存策略,一級緩存,二級緩存,以及緩存是否線程安全等

通過閱讀 Mybatis 源碼,發現在二級緩存上使用了以下幾種裝飾器

FifoCache:先進先出緩存淘汰策略的緩存

LoggingCache:日誌能力的緩存

ScheduledCache:定時清空的緩存

BlockingCache:阻塞式緩存

SerializedCache:序列號能力的緩存

SynchronizedCache:進行同步控制的緩存

從 Mybatis 源碼中發現,Mybatis 二級緩存使用 HashMap 來存儲緩存的數據,那問題來了,二級緩存使用 HashMap 會有併發安全問題嗎?

答案是 不會,因爲使用了 SynchronizedCache 裝飾器。

一級緩存,二級緩存對比圖:

m7cRo4

那 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