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