当前位置: 首页 > news >正文

说说MyBatis一、二级缓存和Spring一二级缓存有什么关系?

大家好,我是锋哥。今天分享关于【说说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 缓存的关系

  1. 作用范围不同

    • MyBatis 的一级缓存是会话级别的缓存,二级缓存是 Mapper 级别的缓存,主要与数据库查询和 SQL 会话的生命周期有关。
    • Spring 缓存 是面向方法调用的缓存,通常与应用层的业务逻辑有关,而不是特定的 SQL 查询。
  2. 缓存内容不同

    • MyBatis 的缓存 专注于 SQL 查询结果缓存,优化数据库查询性能。
    • Spring 的缓存 主要是缓存方法的返回值,用于减少重复计算或避免重复的外部服务调用。
  3. 没有直接关系

    • Spring 和 MyBatis 的缓存机制是相互独立的。你可以在一个 Spring 项目中同时使用 MyBatis 的缓存和 Spring 的缓存机制,它们不会直接干扰对方。
    • 例如,你可以使用 Spring Cache 来缓存某些业务逻辑方法的返回值,同时使用 MyBatis 的二级缓存来缓存 SQL 查询的结果。
  4. 协同工作

    • 在某些场景下,你可能希望 Spring 的缓存和 MyBatis 的缓存协同工作。例如,Spring 缓存可以用于缓存一些业务逻辑的结果,而 MyBatis 的缓存可以缓存数据库查询的结果,二者的协同可以进一步提升系统性能。
    • 如果你使用 Spring 和 MyBatis 集成,并且使用了二级缓存,你可以通过 Spring 的 @Cacheable 和 MyBatis 的二级缓存共同缓存不同层级的数据,进一步减少数据库查询的频率。

总结

  • MyBatis 的一级缓存和二级缓存 是与 SQL 查询和数据库会话相关的缓存机制,主要用于减少数据库查询的次数,一级缓存是会话级缓存,二级缓存是跨会话共享的缓存。
  • Spring 缓存 是一种方法级的缓存机制,主要用于缓存方法执行的结果,优化应用层逻辑的性能,它不直接涉及数据库查询缓存。
  • 两者的缓存机制是独立的,但可以在同一项目中同时使用,互不干扰,甚至可以协同工作以提高系统的性能。

相关文章:

  • Vue Router动态改变路由参数的两种方法
  • 装饰器模式介绍和典型实现
  • k8s常用命令
  • js的闭包
  • linux 运行脚本命令区别
  • Pinecone数据库介绍、Milvus数据库介绍
  • 基于FastAPI与Kimi AI的智能聊天应用开发实践
  • 6. 使用VUE实现前端页面的分级嵌套
  • Spring Boot集成阿里云OSS:对象存储实战指南
  • 【学习】数字经济下数据价值化的内在逻辑与关键挑战
  • Vue的实例
  • SpringBoot整合Log4j2进行日志记录异步写入日志文件
  • 《深度剖析Android 12 SystemUI锁屏通知布局亮屏流程:从源码到实现》
  • 0323-B树、B+树
  • Mybatis-plus配置动态多数据源
  • Linux系统之yum本地仓库创建
  • EMC知识学习一
  • 【android】补充
  • Jenkins 配置python项目和allure
  • 【HTML 基础教程】HTML 元素
  • java web做网站的优势/吴忠seo
  • 管理咨询人员的基本素质/湖南seo推广多少钱
  • 做淘宝客网站必须备案吗/深圳网络推广解决方案
  • 网站登记模板/深圳推广不动产可视化查询
  • 滑县网站建设服务/企业网站优化服务公司
  • 网络推广做哪个网站比较好/环球网疫情最新动态