Mybatis 缓存机制

序言

本文和大家聊聊 Mybatis 缓存。

一、本地缓存

Mybatis 内置了一个强大的事务性查询缓存机制,它可以非常方便地配置和定制。 默认情况下,只启用了本地的会话缓存(又称一级缓存),它仅仅对一个会话中的数据进行缓存。

在 Mybatis 中,一级缓存是基于 SqlSession 的。每个新的 SqlSession 都有自己的一级缓存,这个缓存只对当前的 SqlSession 可见。当 SqlSession 提交或关闭后,它的一级缓存也会清空。

在同一个 SqlSession 中,相同的查询会被缓存,所以如果在同一个 SqlSession(也就是同一个事务中)执行相同的查询两次,第二次查询会直接从缓存中获取结果,而不会去数据库中查询。

@SpringBootTest
public class AppTest {@Resourceprivate UserMapper userMapper;@Test@Transactionalpublic void test() {List<User> user1 = userMapper.getAll();List<User> user2 = userMapper.getAll();user1.forEach(System.out::println);System.out.println("===============");user2.forEach(System.out::println);}
}

以上面的查询为例,在一个事务中调用 userMapper.getAll() 两次,我们会发现如下结果:

image.png

二、全局缓存

在 Mybatis 中,二级缓存也被称为全局缓存或者 Mapper 级别的缓存。二级缓存的作用范围是整个 namespace,可以被多个 SqlSession 共享。二级缓存的主要目的是解决一级缓存不能跨会话共享的问题

默认情况下,Mybatis 只启用了本地的会话缓存,要启用全局的二级缓存,需要在 SQL 映射文件中添加一行:

<cache/>

当开启了二级缓存之后,多次查询会发现:第一次若二级缓存未命中,会执行查询数据库,接下来的查询会命中二级缓存。

image.png

在二级缓存中:

  1. 映射语句文件中的所有 select 语句的结果将会被缓存。
  2. 映射语句文件中的所有 insert、update 和 delete 语句会刷新缓存。
  3. 缓存会使用最近最少使用算法(LRU, Least Recently Used)算法来清除不需要的缓存。
  4. 缓存不会定时进行刷新(也就是说,没有刷新间隔)

三、缓存的工作流程

workspace (1).png

Mybatis 缓存的工作流程如下:

  1. 首先,MyBatis 会检查二级缓存中是否有对应的结果。如果二级缓存中有对应的结果,MyBatis 就会直接返回这个结果。
  2. 如果二级缓存中没有对应的结果,MyBatis 会继续检查一级缓存。如果一级缓存中有对应的结果,MyBatis 就会直接返回这个结果,而不会去查询数据库。
  3. 如果一级缓存和二级缓存中都没有对应的结果,MyBatis 就会去数据库中查询。

往期推荐

  1. 为什么 MySQL 单表数据量最好别超过 2000w
  2. ConcurrentHashMap 源码分析(一)
  3. IoC 思想简单而深邃
  4. ThreadLocal
  5. JDK 动态代理

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

飞行汽车飞行控制系统功能详解

飞行汽车是一种创新的交通工具&#xff0c;结合了汽车和飞机的特点。它可以在陆地上行驶&#xff0c;同时也具备在空中飞行的能力。飞行汽车的概念已经存在多年&#xff0c;并且近年来随着技术的进步和研发的深入&#xff0c;这种交通工具正在逐渐从概念走向现实。 飞行汽车的…

Java中的BIO、NIO与AIO

1.概述 I/O 模型简单的理解&#xff1a;就是用什么样的通道进行数据的发送和接收&#xff0c;很大程度上决定了程序通信的性能。Java 共支持 3 种网络编程模型 I/O 模式&#xff1a;BIO、NIO、AIO。 2.Java BIO Java BIO(Blocking I/O)&#xff1a;是传统的java io 编程&#…

微信小程序开发六(自定义组件)

自定义组件的创建&#xff1a; 如何创建&#xff1a; 右键选择新建component 创建完成之后需要打开app.json&#xff0c;这是全局使用这个组件&#xff0c;想要单独的页面使用&#xff0c;就在当前页面的json文件中定义 "usingComponents": {"my-zj": &quo…

影像仪在工业测量中的优势

在工业制造领域&#xff0c;测量是确保产品质量和生产效率的关键步骤之一。 影像仪在工业测量中的优势 1、表面检测和缺陷检测的应用 影像仪能够通过高分辨率的相机和精密的镜头系统&#xff0c;实现对产品的高精度三维成像&#xff0c;提供高分辨率的图像&#xff0c;并且可…

ZYNQ之嵌入式开发04——自定义IP核实现呼吸灯、固化程序

文章目录 自定义IP核——呼吸灯实验固化程序 自定义IP核——呼吸灯实验 Xilinx官方提供了很多IP核&#xff0c;在Vivado的IP Catalog中可以查看这些IP核&#xff0c;在构建自己复杂的系统时&#xff0c;只使用Xilinx官方的免费IP核一般满足不了设计的要求&#xff0c;因此很多…

社交媒体数据恢复:Facebook

在使用Facebook的过程中&#xff0c;可能会出现数据丢失的情况&#xff0c;如误删了重要的帖子、照片或其他文件。在这种情况下&#xff0c;你可以尝试以下方法来恢复Facebook的数据。 首先&#xff0c;确保你备份了Facebook的数据。如果你定期备份数据&#xff0c;那么恢复起…

1张图片+3090显卡微调Qwen-VL视觉语言大模型(仅做演示、效果还需加大数据量)

原项目地址&#xff1a;https://github.com/QwenLM/Qwen-VL/blob/master/README_CN.md 环境本地部署&#xff08;见之前博文&#xff09; 【本地部署 】23.08 阿里Qwen-VL&#xff1a;能对图片理解、定位物体、读取文字的视觉语言模型 (推理最低12G显存) 一、数据集格式说明 …

检索增强生成(RAG)技术

随着大型语言模型&#xff08;LLMs&#xff09;在自然语言处理&#xff08;NLP&#xff09;领域的显著进步&#xff0c;它们在多个评估基准测试中显示出超越人类水平的语言和知识掌握能力。然而&#xff0c;这些模型在实际应用中也面临着一系列挑战&#xff0c;如制造事实、知识…

挑战一周完成Vue3实战项目硅谷甄选Day1:项目初始化、项目配置、项目集成

一、项目初始化 node v16.4.0以上&#xff08;查看node版本 : node -v&#xff09; pnpm 8.0.0&#xff08;npm i -g pnpm8.0.0&#xff09; 在想创建的位置新建文件夹自己命名 在此文件夹下cmd:pnpm create vite 选择如下配置 Project name&#xff08;项目名称&#xff0…

15.接口自动化学习-Mock(挡板/测试桩)

场景&#xff1a; 新需求还未开发时&#xff0c;使用mock提早介入测试&#xff0c;等后边开发后&#xff0c;进行调试 三方接口返回效率低&#xff0c;使用mock技术走通流程 1.mock方式 &#xff08;1&#xff09;如果会写django或flask,可以写简单对应的代码 &#xff08;…

Nginx 防盗链

原文&#xff1a;https://blog.iyatt.com/?p14998 基于 Nginx 1.18 服务器默认配置文件路径&#xff1a;/etc/nginx/sites-available/default 屏蔽非指定域名的解析 我这里如果发现请求的地址不是我的 iyatt.com&#xff0c;就会返回 403 比如有人用其它域名指向我的服务器…

《ESP8266通信指南》4-以Client进行TCP通信(AT指令)

往期 《ESP8266通信指南》3-常用AT指令详解-8266连WIFI-CSDN博客 《ESP8266通信指南》2-ESP8266 AT测试-CSDN博客 《ESP8266通信指南》1-ESP8266 简介-CSDN博客 1. 小节目标 通过 AT 指令使用 8266 进行 TCP 通信 2. 书接上回 复习以下&#xff0c;上一小节我们讲到了 8…