MyBatis 的一级缓存和二级缓存?
MyBatis 面试题发布于
一、一级缓存
- 默认开启,作用域是 SqlSession。
- 同一个 SqlSession 内,相同 SQL 直接从缓存取。
- 执行 update/insert/delete 或 close 后缓存清空。
- 多个 SqlSession 不共享,可能导致脏读。
二、二级缓存
- 需手动开启,作用域是 Mapper(namespace)。
- 多个 SqlSession 共享同一 Mapper 的缓存。
- 实现:Mapper 上标注
<cache/>,实体类实现 Serializable。 - 多表操作时可能脏数据,实际生产用得少,多用 Redis 替代。
三、注意
二级缓存跨 SqlSession,一个 SqlSession 更新数据,另一个可能读到旧值。分布式环境下建议不用。