MyBatis一级缓存和二级缓存如何实现?

MyBatis 拥有以下两种缓存实现:
一级缓存(本地缓存)和二级缓存(全局缓存)。

一级缓存:

  • 作用域是 SqlSession。
  • 自动开启,不需要手动配置。
  • 存在于本地线程中, SqlSession 结束则清空缓存。

实现:

  • 每个 SqlSession 中维护一个PerpetualCache实例。
  • 执行相同的Sql时,查询缓存中是否有,如果有直接使用缓存。
  • 否则查询数据库,得出结果后存入缓存并返回。

二级缓存:

  • 作用域是Mapper。
  • 需手动开启和配置。
  • 存在于 Map 在一个缓存中,同一个 namespace 的 SqlSession 可以共享。

实现:

  • 每个 Mapper 映射有一个 Cache 接口实现。
  • 第一次查询时,先查询缓存中的内容。
  • 缓存没有内容时,查询数据库,并更新缓存。
  • 更新的SQL会清空缓存。

MyBatis 提供的缓存实现有:

  • PerpetualCache:一级缓存
  • LruCache:最近最少使用缓存
  • EhcacheCache:使用 Ehcache 作为二级缓存
  • etc

总的来说,MyBatis 使用 PerpetualCache 实现一级缓存,使用 Cache接口实现二级缓存。 提供不同的缓存实现类。通过缓存可以有效提高 MyBatis 的性能。