Java面试题更新 2026-08-03

请描述 MyBatis 缓存的工作机制,包括一级缓存与二级缓存的层级结构、它们分别默认是否开启以及各自的失效条件,并说明缓存不一致时的处理策略。

考察说明

考察对 MyBatis 缓存体系的理解,特别是缓存层级、生命周期和脏读问题的处理。

回答思路

  1. 【回答框架 1】MyBatis 缓存分两级:一级缓存是 SqlSession 级别的本地缓存,默认开启,作用范围是同一个 SqlSession 内相同的查询语句和参数,当执行增删改操作时会清空一级缓存以保证数据及时更新。
  2. 【回答框架 2】二级缓存是 mapper 级别的全局缓存,默认不开启,需要配置 cache 标签或注解启用,由多个 SqlSession 共享,数据存储在内存中并可能序列化存储,需要注意缓存命中率和内存占用。
  3. 【回答框架 3】二级缓存的失效条件与一级缓存类似,执行增删改操作会触发对应 mapper 的缓存清空,但不同 mapper 之间互不影响。
  4. 【回答框架 4】缓存不一致主要发生在多实例或多线程场景,一级缓存仅作用于单会话,二级缓存跨会话,但都依赖应用控制。解决策略包括使用分布式缓存或设置合理的缓存刷新间隔。
  5. 【回答框架 5】需要注意缓存的序列化要求,使用二级缓存时实体类必须实现 Serializable 接口,并考虑查询是否适合缓存,避免缓存穿透和雪崩。
  6. 【关键点 1】一级缓存是 SqlSession 级别,默认开启,增删改操作会清空缓存。
  7. 【关键点 2】二级缓存是 mapper 级别,默认关闭,需要显式配置。
  8. 【关键点 3】缓存不一致的根源在于事务跨多个 SqlSession 或节点,需结合业务场景权衡。
  9. 【关键点 4】使用二级缓存时实体类需要可序列化。
  10. 【易错点 1】不能依赖 MyBatis 缓存保证分布式环境下的强一致性。
  11. 【易错点 2】二级缓存可能加剧脏数据暴露,尤其在高并发写场景。
  12. 【易错点 3】缓存配置不当可能导致内存溢出,需设置合理的缓存大小和淘汰策略。