mybatis二级缓存的配置
顺带分享个福利:2025年Java面试宝典网盘链接 ,提取码: 9b3g,建议提前保存!
作为面试常客,mybatis二级缓存几乎是必考题。今天咱们就掰开揉碎聊聊它的配置逻辑,完全从面试实战角度出发,让你面对考官能对答如流。
mybatis二级缓存到底是个啥?
简单说,mybatis二级缓存是跨SqlSession的缓存机制。一级缓存作用域仅限单个SqlSession,而mybatis二级缓存的生命周期与整个SqlSessionFactory绑定。这意味着,不同用户、不同请求只要命中相同SQL,就能直接从mybatis二级缓存中取数据,极大减少数据库压力。

为什么面试官总问mybatis二级缓存配置?
- 性能优化体现:合理配置mybatis二级缓存直接反映你对系统性能优化的理解深度
- 坑点识别能力:误用mybatis二级缓存会导致脏读、内存溢出,面试官要看你是否踩过坑
- 框架原理掌握:涉及Executor、Cache接口设计,能看出MyBatis底层认知
手把手配置mybatis二级缓存(核心四步)
mybatis二级缓存开启第一步:全局开关
在mybatis-config.xml中必须显式开启:
<settings>
<!-- 关键!启用二级缓存总开关 -->
<setting name="cacheEnabled" value="true"/>
</settings>
mybatis二级缓存开启第二步:Mapper层声明
在需要缓存的Mapper.xml增加<cache/>标签:
<mapper namespace="com.example.UserMapper">
<!-- 核心配置!声明启用该命名空间的二级缓存 -->
<cache
eviction="LRU"
flushInterval="60000"
size="1024"
readOnly="true"/>
</mapper>
参数释义:
eviction:淘汰策略(LRU/FIFO/SOFT/WEAK)flushInterval:自动刷新时间(毫秒)size:缓存对象最大数量readOnly:是否只读(性能关键选项)
mybatis二级缓存开启第三步:实体类序列化
必须! 缓存对象需实现Serializable接口:
public class User implements Serializable {
// ... 字段和getter/setter
}
mybatis二级缓存开启第四步:语句级控制
针对特定SQL微调缓存行为:
<select id="selectById" resultType="User" useCache="true">
SELECT * FROM user WHERE id = #{id}
</select>
<insert id="insertUser" flushCache="true">
INSERT INTO user(...) VALUES (...)
</insert>
配置mybatis二级缓存必须绕开的深坑
- 分布式环境失效:单机缓存无法跨节点共享,此时需集成Redis等中央缓存(常考分布式解决方案)
- 关联查询更新陷阱:修改A表数据不会自动清除B表关联缓存,需手动配置
<cache-ref/>或写拦截器 - 事务提交才生效:未提交事务的修改不会刷新缓存(考官爱问缓存更新时机)
- 大对象内存溢出:缓存大量数据务必设置合理的
size和eviction策略

高频面试题拆招
Q:二级缓存导致脏读怎么破?
A:优先考虑readOnly=true避免修改缓存对象;或使用BlockingCache加锁保证线程安全。
Q:如何强制清空某个二级缓存?
A:获取SqlSession后调用clearCache(),但实际更常用Cache接口的clear()方法。
Q:一级缓存和二级缓存并存时优先级?
A:查询顺序:二级缓存 → 一级缓存 → 数据库。执行更新操作时,同一事务内先清一级缓存,事务提交后再清二级缓存。
顺手分享个福利 👉 如果需要买面试鸭会员,通过 面试鸭返利网 找我下单,能返25元!省杯奶茶钱不香嘛~
最后叮嘱
搞懂mybatis二级缓存配置的关键在于理解其作用域与生命周期。生产环境务必结合监控评估缓存命中率,避免“为了缓存而缓存”。面试时被问到配置,重点说清楚序列化要求、参数调优和典型避坑方案,这三点答到位绝对加分!



