MyBatis二级缓存XML配置实战指南

2025年Java面试宝典网盘地址:
点击下载
提取码:9b3g
什么是MyBatis二级缓存?
简单来说,MyBatis二级缓存是跨SqlSession的缓存机制。与一级缓存(SqlSession级别)不同,二级缓存的生命周期与整个应用同步。当多个SqlSession操作同一数据时,直接从缓存读取结果,大幅减少数据库访问次数。这在面试中常被问及优化场景。
XML配置二级缓存的步骤
1️⃣ 启用Mapper层缓存
在对应的Mapper.xml中添加<cache/>标签即可开启基础二级缓存:
<mapper namespace="com.example.UserMapper">
<cache/>
<!-- 其他SQL配置 -->
</mapper>
关键点:该操作会自动启用默认的MyBatis二级缓存实现(PerpetualCache + LRU淘汰策略)。
2️⃣ 自定义缓存策略(可选)
通过<cache>属性调整缓存行为:
<cache
eviction="FIFO"
flushInterval="60000"
size="512"
readOnly="true"/>
eviction:淘汰策略(LRU/FIFO/SOFT/WEAK)flushInterval:自动刷新时间(毫秒)size:缓存对象数量上限readOnly:是否只读(性能优化关键)
3️⃣ 序列化支持

重要陷阱:若返回对象未实现Serializable接口,缓存会报序列化错误!务必检查所有实体类:
public class User implements Serializable {
// 属性和方法
}
避坑指南:五大常见问题
❌ 缓存脏读
现象:多表关联操作后数据不一致
解决:在<insert>/<update>/<delete>标签中配置flushCache="true"(默认已开启)
❌ 事务未提交时缓存生效
原理:二级缓存在事务提交后更新
应对方案:确保事务完整执行,避免跨事务缓存污染
❌ 分布式环境缓存失效
经典场景:集群部署时本地缓存不共享
优化方向:集成Redis等分布式缓存(需自定义Cache接口实现)
❌ 缓存穿透风险

预防措施:
- 对空结果进行短时间缓存
- 使用布隆过滤器拦截无效请求
❌ 缓存配置冲突
典型错误:同时使用<cache-ref>和<cache>
规范建议:同一命名空间内只使用一种xml配置方式
什么场景该用二级缓存?
- 读多写少:如商品信息、基础配置数据
- 数据实时性要求低:允许分钟级延迟
- 结果集稳定:查询参数变化少
💡 性能对比测试:
百万级数据查询测试中,开启MyBatis二级缓存后,重复查询响应时间从120ms降至2ms!
最后的小福利
如果大家在准备面试时需要开通面试鸭会员,可以到面试鸭返利网找我,通过专属渠道下单可返利25元!系统覆盖Java/大数据/算法等方向高频真题,配合二级缓存这类调优知识,助你轻松拿下Offer~
更多MyBatis调优技巧,欢迎访问👉 面试鸭返利网 👈获取面试宝典!


