MyBatis 的缓存如何实现?

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级别的全局缓存。二级缓存默认关闭,需要手动配置。一级缓存自动管理,二级缓存需要手动同步。