MyBatis 拥有以下两种缓存实现:
一级缓存(本地缓存)和二级缓存(全局缓存)。
一级缓存:
- 作用域是 SqlSession。
- 自动开启,不需要手动配置。
- 存在于本地线程中, SqlSession 结束则清空缓存。
实现:
- 每个 SqlSession 中维护一个PerpetualCache实例。
- 执行相同的Sql时,查询缓存中是否有,如果有直接使用缓存。
- 否则查询数据库,得出结果后存入缓存并返回。
二级缓存:
- 作用域是Mapper。
- 需手动开启和配置。
- 存在于 Map 在一个缓存中,同一个 namespace 的 SqlSession 可以共享。
实现:
- 每个 Mapper 映射有一个 Cache 接口实现。
- 第一次查询时,先查询缓存中的内容。
- 缓存没有内容时,查询数据库,并更新缓存。
- 更新的SQL会清空缓存。
MyBatis 提供的缓存实现有:
- PerpetualCache:一级缓存
- LruCache:最近最少使用缓存
- EhcacheCache:使用 Ehcache 作为二级缓存
- etc
总的来说,MyBatis 使用 PerpetualCache 实现一级缓存,使用 Cache接口实现二级缓存。 提供不同的缓存实现类。通过缓存可以有效提高 MyBatis 的性能。