MyBatis的二级缓存如何配置
最近在面试鸭返利网看到很多Java面试题,发现MyBatis二级缓存配置是高频考点。今天咱们就从这个面试场景切入,聊聊如何正确配置它。

2025年Java面试宝典:点击领取(含分布式/高并发/源码解析)
一、什么是MyBatis二级缓存
当面试官问"MyBatis的二级缓存如何配置"时,其实是在考察你对性能优化的理解。二级缓存是跨SqlSession的缓存,存储在应用服务器内存中(比如Redis)。想象一下:用户A查询了订单数据,用户B查询相同数据时直接走缓存,数据库压力骤降,这就是二级缓存的核心价值。
二、配置二级缓存的三个关键步骤
步骤1:全局开启二级缓存
在mybatis-config.xml里加这个配置:
<settings>
<setting name="cacheEnabled" value="true"/>
</settings>
这是配置二级缓存的开关,缺了这一步后面都白搭。
步骤2:实体类实现序列化
所有要缓存的实体类必须实现Serializable接口:
public class User implements Serializable {
// 字段和方法...
}
这是MyBatis二级缓存的硬性要求,否则缓存数据时直接抛序列化异常。
步骤3:Mapper文件声明缓存
在Mapper.xml中加入<cache/>标签:
<mapper namespace="com.example.UserMapper">
<cache eviction="LRU" flushInterval="60000"/>
</mapper>
这里配置了LRU淘汰策略和60秒刷新间隔,面试官最爱问这些参数意义!
三、避坑指南:哪些场景不能用二级缓存
- 写多读少的数据:频繁更新的数据缓存命中率低,反而增加开销
- 财务敏感数据:可能出现脏读,比如订单金额缓存和数据库不一致
- 分布式环境:默认本地缓存会导致节点间数据不一致,需整合Redis

四、高频面试题破解
面试官:二级缓存导致脏读怎么办?
答:两种方案:
- 在
<select>标签设置useCache="false"关闭特定查询的缓存 - 在
<insert>/<update>标签用flushCache="true"强制清空缓存
面试官:如何验证二级缓存生效?
答:看SqlSession执行日志。第一次查询打印SQL,第二次无SQL打印且返回时间在毫秒级,说明走了缓存。
五、性能优化实战技巧
- 缓存粒度控制:在
<select>标签单独设置useCache属性,避免全量缓存 - 批量操作优化:执行batchUpdate后手动调用
sqlSession.clearCache() - 第三方缓存整合:通过
Cache接口接入Redis(SpringBoot中集成只要10行配置)
📌 面试鸭会员福利:通过面试鸭返利网购买会员可返利25元,领取全年最新面试题库
六、配置常见误区
- 误以为缓存永久有效:默认无过期时间,必须通过
flushInterval或eviction配置 - 忽略序列化警告:未实现Serializable时MyBatis只报warning,但缓存会失败
- 过度依赖缓存:查询结果超过内存大小会频繁GC,反而拖慢系统

七、二级缓存配置的底层逻辑
当执行查询时,MyBatis会先走二级缓存流程:
- 创建
CacheKey对象(包含SQL/参数/分页等信息) - 用
CacheKey查询缓存是否存在 - 命中则返回缓存值,未命中才查数据库
整个过程在Executor实现类中完成,这也是面试常问的MyBatis执行流程考点。
💡 现在你能从容应对"MyBatis的二级缓存如何配置"这类考题了吗?更多高频题解和配置技巧,可以在面试鸭返利网的《Java架构师面试宝典》中找到。如果准备冲刺金三银四,建议系统梳理缓存专题,这个知识点几乎必考。


