大家好,我是锋哥。今天分享关于【说说MyBatis一、二级缓存和Spring一二级缓存有什么关系?】面试题。希望对大家有帮助;
说说MyBatis一、二级缓存和Spring一二级缓存有什么关系?
1000道 互联网大厂Java工程师 精选面试题-Java资源分享网
MyBatis 和 Spring 都提供了缓存机制,以提高数据访问效率和系统性能。但它们的缓存机制有所不同,且彼此之间并没有直接的关联。为了更好地理解两者的缓存机制,我们可以分别探讨 MyBatis 的一、二级缓存和 Spring 的缓存,以及它们的关系。
MyBatis 一、二级缓存
1. MyBatis 一级缓存
- 概念:一级缓存是 MyBatis 中的 默认缓存,它是 SqlSession(会话级)作用域内的缓存。每次执行 SQL 查询时,MyBatis 会先查找一级缓存中是否已有查询结果,如果有,则直接返回缓存中的结果,否则执行 SQL 查询并将结果缓存到一级缓存中。
- 作用域:一级缓存的作用域是 SqlSession,即在同一个
SqlSession
中多次查询相同的数据时,第一次查询会将数据缓存在一级缓存中,第二次查询相同的数据时直接从一级缓存中读取。 - 清空时机:一级缓存会在以下几种情况下被清空:
- 当前
SqlSession
关闭时; - 显式调用
SqlSession.clearCache()
清空缓存; - 执行更新、删除或插入操作后,缓存会自动失效。
- 当前
2. MyBatis 二级缓存
- 概念:二级缓存是 跨 SqlSession 共享的缓存,默认是禁用的,可以通过配置启用。二级缓存的作用范围是 Mapper(或映射文件)级别。即当一个
SqlSession
查询结果存储在二级缓存中后,其他的SqlSession
如果执行相同的查询,也可以从二级缓存中获取数据。 - 实现方式:二级缓存是通过配置的
Cache
来实现的。你可以在 MyBatis 配置文件中启用二级缓存,也可以为每个Mapper
配置是否使用二级缓存。 - 清空时机:二级缓存会在以下情况下被清空:
- 数据库中的数据发生变化(例如:执行了更新、删除或插入操作);
SqlSession
在提交或回滚时会同步到二级缓存;- 显式调用
Mapper.clearCache()
清空缓存。
Spring 一、二级缓存
Spring 本身并没有提供类似 MyBatis 那样的一级、二级缓存机制。Spring 的缓存机制通常是指 Spring Cache(自 Spring 3.1 引入的缓存抽象),它是一个跨层的缓存管理机制,支持对方法执行结果进行缓存。Spring 允许使用不同的缓存实现(如:EhCache、Redis、Caffeine、SimpleMap 等),并通过注解(例如 @Cacheable
)来定义缓存规则。
1. Spring Cache 级别
- 方法级缓存:Spring 缓存机制的核心是基于方法的缓存,当方法被调用时,如果方法的参数未发生变化,则会从缓存中获取结果。这个缓存作用于方法调用级别,与 MyBatis 的缓存概念不同。
- 配置:Spring Cache 可以通过配置缓存管理器(
CacheManager
)和缓存提供者(如 Redis、EhCache 等)来使用。你可以通过注解(例如@Cacheable
)来启用缓存,也可以通过 XML 或 Java 配置进行更细粒度的管理。
2. Spring 的缓存不同于 MyBatis 的一级、二级缓存
- 跨层级缓存:Spring 的缓存更像是跨服务层的缓存(例如,业务层、数据访问层等),用于缓存方法的结果。它并不直接涉及到数据库查询缓存或持久化层级的缓存管理。
- 配置和存储:Spring 提供了抽象的缓存层,可以使用不同的缓存存储介质(如数据库、Redis、内存缓存等),而 MyBatis 的缓存机制则局限于 SQL 查询结果和会话级别的缓存。
MyBatis 一、二级缓存和 Spring 缓存的关系
-
作用范围不同:
- MyBatis 的一级缓存是会话级别的缓存,二级缓存是 Mapper 级别的缓存,主要与数据库查询和 SQL 会话的生命周期有关。
- Spring 缓存 是面向方法调用的缓存,通常与应用层的业务逻辑有关,而不是特定的 SQL 查询。
-
缓存内容不同:
- MyBatis 的缓存 专注于 SQL 查询结果缓存,优化数据库查询性能。
- Spring 的缓存 主要是缓存方法的返回值,用于减少重复计算或避免重复的外部服务调用。
-
没有直接关系:
- Spring 和 MyBatis 的缓存机制是相互独立的。你可以在一个 Spring 项目中同时使用 MyBatis 的缓存和 Spring 的缓存机制,它们不会直接干扰对方。
- 例如,你可以使用 Spring Cache 来缓存某些业务逻辑方法的返回值,同时使用 MyBatis 的二级缓存来缓存 SQL 查询的结果。
-
协同工作:
- 在某些场景下,你可能希望 Spring 的缓存和 MyBatis 的缓存协同工作。例如,Spring 缓存可以用于缓存一些业务逻辑的结果,而 MyBatis 的缓存可以缓存数据库查询的结果,二者的协同可以进一步提升系统性能。
- 如果你使用 Spring 和 MyBatis 集成,并且使用了二级缓存,你可以通过 Spring 的
@Cacheable
和 MyBatis 的二级缓存共同缓存不同层级的数据,进一步减少数据库查询的频率。
总结
- MyBatis 的一级缓存和二级缓存 是与 SQL 查询和数据库会话相关的缓存机制,主要用于减少数据库查询的次数,一级缓存是会话级缓存,二级缓存是跨会话共享的缓存。
- Spring 缓存 是一种方法级的缓存机制,主要用于缓存方法执行的结果,优化应用层逻辑的性能,它不直接涉及数据库查询缓存。
- 两者的缓存机制是独立的,但可以在同一项目中同时使用,互不干扰,甚至可以协同工作以提高系统的性能。