MyBatis提供了两种缓存机制:
- 一级缓存(本地缓存):SqlSession级别的缓存,仅在一个数据库事务中有效。一级缓存默认开启。
- 二级缓存(全局缓存):Mapper级别的缓存,多个SqlSession可以共享。二级缓存需要手动配置。
一级缓存:
- 当 SqlSession 关闭或提交事务后,一级缓存也就清空。
- 对于相同 SqlSession,相同 SQL 调用多次,只有第一次会执行。
二级缓存:
- 全局缓存,多个 SqlSession 可以共享。
- SqlSession 关闭仍然存在。
- MyBatis 提供 lrucache 和 permuteMetrics 两种实现。
- 需要在 SqlSessionFactoryBuilder中配置:
SqlSessionFactory factory =
new SqlSessionFactoryBuilder().
// 其他配置
.cacheEnabled(true)
.build();
在Mapper文件中开启二级缓存:
<mapper namespace="org...UserMapper">
<cache />
</mapper>
所以,MyBatis 的缓存机制主要分成两级:
一级缓存是SqlSession级别内部维护的,二级缓存是Mapper级别的全局缓存。二级缓存默认关闭,需要手动配置。一级缓存自动管理,二级缓存需要手动同步。