【Mybatis】浅谈Mybatis的缓存机制,一级缓存和二级缓存

news2024/12/23 17:36:44

目录

1. 缓存机制介绍

2. 一级缓存

3. 二级缓存

4. mybatis缓存执行流程


1. 缓存机制介绍

MyBatis 的缓存机制是为了提高应用程序的性能而设计的,通过缓存策略来减少数据库的查询次数。MyBatis 提供了两种类型的缓存:一级缓存和二级缓存。

  • 默认情况下,只有一级缓存(session级别的缓存,也称为本地缓存)开启。
  • 默认情况下,二级缓存是关闭的,需要显式启用。
  • 为了提高扩展性。MyBatis定义了缓存接口Cache。我们可以通过实现Cache接口来自定义二级缓存

一级缓存和二级缓存图示

2. 一级缓存

一级缓存是默认启用的,它是基于 SqlSession 的缓存。这意味着在同一个 SqlSession 的生命周期内,对于相同的 SQL 查询,MyBatis 会先检查缓存中是否有之前执行该查询的结果,如果有,则直接从缓存中获取,而不是再次执行 SQL 查询。

  • 作用范围:一级缓存的作用范围仅限于同一个 SqlSession。
  • 自动管理:一级缓存由 MyBatis 自动管理,无需任何配置。
  • 失效条件
    • 当执行更新操作(包括 insert、update 或 delete)时,一级缓存会被清空。
    • 当 SqlSession 关闭或执行了 clearCache() 方法时,一级缓存也会被清空。
    • 如果 SqlSession 设置了 autoCommit 为 true 并且执行了 commit,那么缓存也会被清空。
    • 将一级缓存的作用域设置为语句级别(localCacheScope设置为STATEMENT

一级缓存启用测试

【说明】上面代码表明,测试方法中调用了两次查询方法,但是sql语句就执行了一次就得到了结果,这说明第一次查询后会记录在一级缓存中,如果再次执行sql语句时就会向一级缓存中查看是否此次qlSession会话中是否已经执行过该sql,执行过,就直接到缓存中拿结果,未执行,就向数据库中查询。

一句换:相同的sql语句,没必要执行,到一级缓存中直接拿)

一级缓存失效测试(以执行了 clearCache() 方法时为例

【说明】因为清空了一级缓存,则第二次同样的查询语句在一级缓存中没有找到,就只能向数据找了,所以就执行了两次sql语句。但是为啥查询的对象的属性值相同,确输出 false (地址值不同)?

        这是因为第一次查询的结果 user1 和第二次查询的结果 user2 尽管具有相同的属性值,但由于它们是由两次不同的数据库查询创建的,因此它们是两个不同的对象实例。因此,user1 == user2 返回 false,表示这两个对象的内存地址不同。

3. 二级缓存

二级缓存是一种可选的缓存机制,它在同一个命名空间(namespace)下的多个 SqlSession 之间共享数据。这意味着如果多个 SqlSession 执行相同的查询语句并且这些 SqlSession 都属于同一个命名空间,那么它们就可以共享缓存中的数据。

  • 作用范围:二级缓存的作用范围是全局的,可以在不同的 SqlSession 实例间共享数据。
  • 启用方式
    • 为了启用二级缓存,需要在 配置文件<mapper> 标签中加入 <cache/> 元素。
    • 默认情况下,二级缓存是关闭的,需要显式启用。
    • 你可以为每个 <mapper> 定制缓存策略,例如设置缓存过期时间、缓存存储机制等。
  • 失效条件
    • 默认情况下,当执行了更新操作后,二级缓存不会被清空,除非显式配置。
    • 二级缓存可以通过调用 clear() 方法来手动清空。
    • 二级缓存的数据一致性问题需要特别注意,因为它可能在多个线程或多个事务之间共享。

配置二级缓存代码

<mapper namespace="com.example.mapper.UserMapper">
    <cache type="PERPETUAL" eviction="LRU" flushInterval="60000" size="512" readOnly="true"/>
    
    <!-- SQL 映射 -->
</mapper>

各个参数说明

  • type: 缓存实现类型,默认为 PERPETUAL(永不过期),可以改为其他实现,如 EHCache。
  • eviction: 指定缓存淘汰策略,默认为 LRU(最近最少使用)。
  • flushInterval: 指定缓存刷新间隔时间(毫秒),默认不自动刷新。
  • size: 缓存的最大容量。
  • readOnly: 如果设置为 true,则缓存中的数据被认为是只读的,这样在执行更新操作时就不会刷新缓存。

【注意】

        1. 二级缓存可能会导致数据一致性问题,因此建议在只读操作或者对数据一致性要求较              低的应用中使用。

        2. 对于需要更新操作的场景,应该谨慎使用二级缓存,以避免潜在的数据不一致问题。

4. mybatis缓存执行流程

总流程

  1. 查询开始

    • 当执行一个 SQL 查询时,MyBatis 会首先检查一级缓存中是否存在相同 SQL 语句的结果。
  2. 一级缓存命中

    • 如果一级缓存中有对应的查询结果,MyBatis 将直接从一级缓存中获取结果,而不执行 SQL 语句。
    • 这个结果将被返回给调用者。
  3. 一级缓存未命中

    • 如果一级缓存中没有找到查询结果,MyBatis 会检查二级缓存(如果启用)。
  4. 二级缓存命中

    • 如果二级缓存中有对应的查询结果,MyBatis 将直接从二级缓存中获取结果,而不执行 SQL 语句。
    • 这个结果将被返回给调用者。
  5. 二级缓存未命中

    • 如果二级缓存中也没有找到查询结果,MyBatis 会执行 SQL 语句,并将结果保存到一级缓存中(默认)和二级缓存中(如果启用)。
    • 这个结果同样会被返回给调用者。
  6. 缓存失效

    • 当执行了更新操作(包括 insert、update 或 delete)时,一级缓存会被清空。
    • 二级缓存默认不会被清空,但可以配置为在执行更新操作后清空。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1970069.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

web框架:Django进阶(二)

文章目录 Django进阶&#xff08;二&#xff09;1.orm1.1 基本操作1.2 连接数据库1.3 连接池1.4 多数据库1.4.1 读写分离1.4.2 分库&#xff08;多个app ->多数据库&#xff09;1.4.3 分库&#xff08;单app&#xff09;1.4.4 注意事项 1.5 表关系1.6 数据操作单表一对多正向…

IIS解析漏洞~ IIS7.漏洞分析

IIS解析漏洞 文件解析漏洞是由于中间件错误的将特殊格式的文件解析成可执行网页文件(脚本)&#xff0c;配合文件上传漏洞进行GetShell的漏洞&#xff01; 1.2&#xff1a;IIS7.X 在IIS7.0和IIS7.5版本下也存在解析漏洞&#xff0c;在默认Fast-CGI开启状况下&#xff0c;在一个文…

Modbus通讯协议

Modbus通讯协议 Modbus协议是一种用于电子控制器之间的通信协议&#xff0c;‌它允许不同类型的设备之间进行通信&#xff0c;‌以便进行数据交换和控制。‌Modbus协议最初为可编程逻辑控制器&#xff08;‌PLC&#xff09;‌通信开发&#xff0c;‌现已广泛应用于工业自动化领…

Error: No module factory available for dependency type: CssDependency

本篇主要用来记录VUE打包的问题点&#xff0c;今天使用npm run build:prod 打包VUE出现如下问题&#xff1a; Error: No module factory available for dependency type: CssDependency 因为测试和预发布都挺正常的&#xff0c;正式环境竟然出问题&#xff0c;废话不多说&…

用 Python 编写的井字游戏

一.介绍 在本文中&#xff0c;我将向您展示如何使用 Python 创建一个非常简单的井字游戏。 井字游戏是一种非常简单的双人游戏。因此每次只能有两个玩家玩。该游戏也称为井字游戏或 Xs 和 Os 游戏。一个玩家玩 X&#xff0c;另一个玩家玩 O。在这个游戏中&#xff0c;我们有一…

java+springboot+mysql疾病查询网站01548-计算机毕业设计项目选题推荐(附源码)

摘 要 随着互联网时代的到来&#xff0c;同时计算机网络技术高速发展&#xff0c;网络管理运用也变得越来越广泛。因此&#xff0c;建立一个B/S结构的疾病查询网站&#xff0c;会使疾病查询工作系统化、规范化&#xff0c;也会提高医院形象&#xff0c;提高管理效率。 本疾病查…

最强开源模型 Llama 3.1 部署推理微调实战大全

目录 引言一、Llama 3.1简介二、Llama 3.1性能评估三、Llama 3.1模型推理实战1、环境准备2、安装依赖3、模型下载4、模型推理 四、Llama 3.1模型微调实战1、数据集准备2、导入依赖包3、读取数据集4、处理数据集5、定义模型6、Lora配置7、配置训练参数8、开始Trainer训练9、合并…

Effective Java 学习笔记--第18、19条继承与复合

目录 继承的设计 对用于继承的类可覆盖方法的说明 被继承类还需要遵循的约束 如何对继承类进行测试 如何禁止继承 复合的设计 什么是复合 复合的缺点 这两条的关系较强&#xff0c;核心都是继承&#xff0c;但是更强调继承的脆弱性&#xff0c;而且给出了继承的一个更优…

【云原生】Helm来管理Kubernetes集群的详细使用方法与综合应用实战

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

香港电讯亮相2024算网融合产业发展大会,荣获“SD-WAN优秀产品奖”

秉承“开放、创新、融合、共赢”的发展战略&#xff0c;中国通信标准化协会算网融合产业及标准推进委员会&#xff08;CCSATC621&#xff09;联合中国信息通信研究院&#xff0c;于2024年7月10日共同召开“2024年算网融合产业发展大会”。本次大会发布了多项算网融合领域最新研…

SpringBoot 日志:从基础到高级的全面指南

&#x1f4da; SpringBoot 日志&#xff1a;从基础到高级的全面指南 &#x1f50d; &#x1f4da; SpringBoot 日志&#xff1a;从基础到高级的全面指南 &#x1f50d;摘要引言正文内容一、日志概述 &#x1f4dc;二、日志使用 &#x1f4dd;2.1 打印日志 &#x1f4e3;2.2 日志…

主文件表遗失:数据恢复策略与实战指南

深入解析&#xff1a;无法恢复主文件表的困境 在数字化时代&#xff0c;数据不仅是信息的载体&#xff0c;更是企业运营和个人生活的核心。然而&#xff0c;当遭遇“无法恢复主文件表”的困境时&#xff0c;整个数据系统仿佛被按下了暂停键&#xff0c;让人措手不及。主文件表…

数据集成是什么意思?方法有哪些?数据集成三种方法介绍

1 数据集成是什么 数据集成(Data Intergration)&#xff0c;也称为数据整合&#xff0c;是通过将分布式环境中的异构数据集成起来&#xff0c;为用户提供统一透明的数据访问方式。该定义中的集成是指从整体层面上维护数据的一致性&#xff0c;并提高对数据的利用和共享&#x…

智能语音转Markdown的神器

嘿&#xff0c;技术大咖们&#xff0c;今天我要给你们安利一个超酷炫的智能语音转Markdown笔记系统&#xff0c;它融合了前沿的语音识别技术和强大的AI大模型&#xff0c;绝对是记录和整理信息的神器&#xff01; 打造了一个语音转Markdown的神器 智能语音生成Markdown笔记 这…

芋道源码yudao-cloud 二开日记(商品sku数据归类为规格属性)

商品的每一条规格和属性在数据库里都是单一的一条数据&#xff0c;从数据库里查出来后&#xff0c;该怎么归类为对应的规格和属性值&#xff1f;如下图&#xff1a; 在商城模块&#xff0c;商品的单规格、多规格、单属性、多属性功能可以说是非常完整&#xff0c;如下图&#x…

Java新手启航:JDK 21 版本安装,开启编程之行

在Java开发前&#xff0c;JDK是必不可少的环境&#xff0c;接下来&#xff0c;让我们一起完成JDK 21版本的下载和安装&#xff01; 种一棵树最好的时间是10年前&#xff0c;其次就是现在&#xff0c;加油&#xff01; …

【Redis 进阶】事务

Redis 的事务和 MySQL 的事务概念上是类似的&#xff0c;都是把一系列操作绑定成一组&#xff0c;让这一组能够批量执行。 一、Redis 的事务和 MySQL 事务的区别 1、MySQL 事务 原子性&#xff1a;把多个操作打包成一个整体。&#xff08;要么全都做&#xff0c;要么都不做&am…

实时渲染云交互助力汽车虚拟仿真新体验!

汽车虚拟仿真是指利用软件和数学模型&#xff0c;模拟汽车的设计、制造、测试和运行等过程&#xff0c;以及汽车与环境、驾驶员、乘客等的交互。汽车虚拟仿真可以帮助汽车工程师快速验证方案&#xff0c;优化性能&#xff0c;降低成本&#xff0c;提高安全性和可靠性。 ​ 汽车…

S32G3系列芯片Serial Boot功能详解!

《S32G3系列芯片——Boot详解》系列——S32G3系列芯片Serial Boot功能详解&#xff01;★★★ 一、Serial Boot模式概述二、串行下载协议2.1 基于UART和CAN的下载协议概述2.2 基于FlexCAN的Serial Boot2.2.1 IO配置2.2.2 时钟配置2.2.3 通信波特率2.2.4 基于FlexCAN的Serial Bo…

精心准备的高水平的博客【点评语】,来抄啊!

大家好&#xff0c;我是一名_全栈_测试开发工程师&#xff0c;已经开源一套【自动化测试框架】和【测试管理平台】&#xff0c;欢迎大家关注我&#xff0c;和我一起【分享测试知识&#xff0c;交流测试技术&#xff0c;趣聊行业热点】。 第 1 条 这篇博客文章如同灯塔般照亮了技…