<select> 共享緩存。SqlSessionFactory 存續,跨 SqlSession 有效。<insert>/<update>/<delete> 執行後自動清空該 namespace 緩存。在 Mapper XML 根節點 <mapper> 下直接添加:
<cache/>
等效於以下默認行為:
select 緩存。insert/update/delete 刷新緩存。<cache
eviction="FIFO" <!-- 淘汰策略:LRU/FIFO/SOFT/WEAK -->
flushInterval="60000" <!-- 定時刷新間隔(毫秒),無則不定時刷新 -->
size="512" <!-- 最大引用數 -->
readOnly="true" <!-- true=只讀(直接返回引用,高效但不安全);false=可讀寫(序列化副本,安全) -->
/>
| 屬性 | 可選值 | 默認值 | 說明 |
|---|---|---|---|
| eviction | LRU, FIFO, SOFT, WEAK | LRU | 對象淘汰演算法 |
| flushInterval | 正整數(ms) | 無 | 定時刷新間隔,0 或不配置則關閉 |
| size | 正整數 | 1024 | 緩存條目上限 |
| readOnly | true/false | false | 只讀模式性能更高,但調用者不可修改返回對象 |
實現 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 操作同一張表,可引用同一緩存實例:
<!-- 在 B Mapper 中引用 A Mapper 的緩存 -->
<cache-ref namespace="com.example.mapper.UserMapper"/>
效果:B Mapper 的查詢走 A Mapper 的緩存,A Mapper 的增刪改會刷新共享緩存。
Serializable(可讀寫模式下需序列化/反序列化)。statementId + 参数值 + RowBounds,參數必須正確實現 equals/hashCode。RowBounds)不同頁碼視為不同 Key,不會互相覆蓋。MyBatis 二級緩存配置靈活,適合「讀多寫少、數據變化不頻繁」的場景。生產環境建議結合監控(命中率、內存佔用)動態調整策略,或直接升級為分散式緩存方案。