답변:
MyBatis 的缓存机制主要分为一级缓存和二级缓存,下面是对这两种缓存的简单介绍:
一级缓存
- 作用范围:一级缓存是 SqlSession 级别的缓存,每个 SqlSession 都有自己的一级缓存。
- 生命周期:一级缓存的生命周期与 SqlSession 相同,当 SqlSession 关闭时,一级缓存也会被清空。
- 特点:
- 一级缓存默认是开启的。
- 在同一个 SqlSession 中,如果执行相同的查询,MyBatis 会先查找一级缓存,如果缓存中有结果,则直接返回,不会再执行 SQL 查询。
- 适合于同一事务中多次查询相同数据的场景。
二级缓存
- 作用范围:二级缓存是 Mapper 级别的缓存,可以被多个 SqlSession 共享。
- 生命周期:二级缓存的生命周期与 MyBatis 的 SqlSessionFactory 相同,通常在应用程序运行期间保持有效。
- 特点:
- 二级缓存默认是关闭的,需要在配置文件中显式开启。
- 需要在 Mapper 接口上配置缓存,使用
@CacheNamespace
注解或在 XML 中配置。
- 二级缓存可以使用不同的缓存实现(如 Ehcache、Redis 等)。
- 适合于跨多个 SqlSession 的数据共享场景。
总结
- 一级缓存:SqlSession 级别,快速,适合同一会话中的重复查询。
- 二级缓存:Mapper 级别,跨会话共享,适合多次查询相同数据的场景,但需要额外配置和管理。
通过合理使用这两种缓存,可以提高 MyBatis 的查询性能,减少数据库的访问压力。