MyBatis 的一级缓存和二级缓存?

MyBatis 面试题发布于

一、一级缓存

  • 默认开启,作用域是 SqlSession。
  • 同一个 SqlSession 内,相同 SQL 直接从缓存取。
  • 执行 update/insert/delete 或 close 后缓存清空。
  • 多个 SqlSession 不共享,可能导致脏读。

二、二级缓存

  • 需手动开启,作用域是 Mapper(namespace)。
  • 多个 SqlSession 共享同一 Mapper 的缓存。
  • 实现:Mapper 上标注 <cache/>,实体类实现 Serializable。
  • 多表操作时可能脏数据,实际生产用得少,多用 Redis 替代。

三、注意

二级缓存跨 SqlSession,一个 SqlSession 更新数据,另一个可能读到旧值。分布式环境下建议不用。