首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

MyBatis 二級緩存完整配置指南:XML 映射緩存、自定義緩存、緩存引用

     編輯:Java 相關知識

二級緩存核心概念

  • 作用域:Mapper 級別(namespace),同一 Mapper 下的所有 <select> 共享緩存。
  • 生命週期:隨 SqlSessionFactory 存續,跨 SqlSession 有效。
  • 觸發刷新:同一 Mapper 下的 <insert>/<update>/<delete> 執行後自動清空該 namespace 緩存。

啟用二級緩存:最簡配置

在 Mapper XML 根節點 <mapper> 下直接添加:

<cache/>

等效於以下默認行為:

  • 所有 select 緩存。
  • insert/update/delete 刷新緩存。
  • LRU 淘汰策略、無定時刷新、最多 1024 引用、可讀寫(序列化副本)。

進階配置屬性詳解

<cache
    eviction="FIFO"               <!-- 淘汰策略:LRU/FIFO/SOFT/WEAK -->
    flushInterval="60000"         <!-- 定時刷新間隔(毫秒),無則不定時刷新 -->
    size="512"                    <!-- 最大引用數 -->
    readOnly="true"               <!-- true=只讀(直接返回引用,高效但不安全);false=可讀寫(序列化副本,安全) -->
/>
屬性可選值默認值說明
evictionLRU, FIFO, SOFT, WEAKLRU對象淘汰演算法
flushInterval正整數(ms)無定時刷新間隔,0 或不配置則關閉
size正整數1024緩存條目上限
readOnlytrue/falsefalse只讀模式性能更高,但調用者不可修改返回對象

自定義緩存實現

實現 org.mybatis.cache.Cache 接口,並在 <cache type="..."/> 指定:

public interface Cache {
    String getId();
    int getSize();
    void putObject(Object key, Object value);
    Object getObject(Object key);
    boolean hasKey(Object key);
    Object removeObject(Object key);
    void clear();
    ReadWriteLock getReadWriteLock(); // 並發控制
}

配置示例(整合 Redis/Ehcache/Caffeine):

<cache type="com.example.cache.MyRedisCache"/>

緩存引用:跨 Mapper 共享緩存

若多個 Mapper 操作同一張表,可引用同一緩存實例:

<!-- 在 B Mapper 中引用 A Mapper 的緩存 -->
<cache-ref namespace="com.example.mapper.UserMapper"/>

效果:B Mapper 的查詢走 A Mapper 的緩存,A Mapper 的增刪改會刷新共享緩存。

關鍵注意事項

  • 實體類必須實現 Serializable(可讀寫模式下需序列化/反序列化)。
  • 緩存 Key 基於 statementId + 参数值 + RowBounds,參數必須正確實現 equals/hashCode。
  • 分頁查詢(RowBounds)不同頁碼視為不同 Key,不會互相覆蓋。
  • 高併發寫入場景慎用二級緩存,頻繁刷新導致命中率極低,建議改用 Redis 等分散式緩存。

結語

MyBatis 二級緩存配置靈活,適合「讀多寫少、數據變化不頻繁」的場景。生產環境建議結合監控(命中率、內存佔用)動態調整策略,或直接升級為分散式緩存方案。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved