面试鸭返利网

mybatis的二级缓存如何配置

MyBatis二级缓存配置是Java面试高频考点,掌握它能显著提升应用性能。本文详解二级缓存工作原理,从全局开启配置到Mapper文件声明,重点讲解实体类序列化要求、LRU淘汰策略设置及缓存刷新机制。针对分布式环境脏读问题,提供禁用特定查询缓存和强制清空缓存的解决方案,并分享验证缓存生效的实战技巧。通过面试鸭返利网可获取完整Java面试题库,包含MyBatis缓存优化等核心技术点,助你轻松应对金三银四求职季。

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秒刷新间隔,面试官最爱问这些参数意义!

三、避坑指南:哪些场景不能用二级缓存

  1. 写多读少的数据:频繁更新的数据缓存命中率低,反而增加开销
  2. 财务敏感数据:可能出现脏读,比如订单金额缓存和数据库不一致
  3. 分布式环境:默认本地缓存会导致节点间数据不一致,需整合Redis

缓存策略选择示意图

四、高频面试题破解

面试官:二级缓存导致脏读怎么办?
:两种方案:

  1. <select>标签设置useCache="false"关闭特定查询的缓存
  2. <insert>/<update>标签用flushCache="true"强制清空缓存

面试官:如何验证二级缓存生效?
:看SqlSession执行日志。第一次查询打印SQL,第二次无SQL打印且返回时间在毫秒级,说明走了缓存。

五、性能优化实战技巧

  1. 缓存粒度控制:在<select>标签单独设置useCache属性,避免全量缓存
  2. 批量操作优化:执行batchUpdate后手动调用sqlSession.clearCache()
  3. 第三方缓存整合:通过Cache接口接入Redis(SpringBoot中集成只要10行配置)

📌 面试鸭会员福利:通过面试鸭返利网购买会员可返利25元,领取全年最新面试题库

六、配置常见误区

  • 误以为缓存永久有效:默认无过期时间,必须通过flushIntervaleviction配置
  • 忽略序列化警告:未实现Serializable时MyBatis只报warning,但缓存会失败
  • 过度依赖缓存:查询结果超过内存大小会频繁GC,反而拖慢系统

缓存优化方案

七、二级缓存配置的底层逻辑

当执行查询时,MyBatis会先走二级缓存流程:

  1. 创建CacheKey对象(包含SQL/参数/分页等信息)
  2. CacheKey查询缓存是否存在
  3. 命中则返回缓存值,未命中才查数据库
    整个过程在Executor实现类中完成,这也是面试常问的MyBatis执行流程考点。

💡 现在你能从容应对"MyBatis的二级缓存如何配置"这类考题了吗?更多高频题解和配置技巧,可以在面试鸭返利网的《Java架构师面试宝典》中找到。如果准备冲刺金三银四,建议系统梳理缓存专题,这个知识点几乎必考。

如果你想获取更多关于面试鸭的优惠信息,可以访问面试鸭返利网面试鸭优惠网,了解最新的优惠活动和返利政策。

立即加入面试鸭会员 →