MyBatis:缓存

MyBatis

  • 缓存
    • 一级缓存
    • 二级缓存

在这里插入图片描述

缓存

缓存,是数据交换的缓冲区(临时保存数据的地方)。即将数据(数据一般为频繁查询且不易改变)保存在计算机内存中,下次读取数据时直接从内存中获取,以避免频繁的访问数据库或磁盘文件,从而提高程序性能。

MyBatis 缓存,是 MyBatis 提供的一种优化机制,用于提高查询效率和减少与数据库的交互次数。在 MyBatis 缓存中,分为一级缓存二级缓存

一级缓存

一级缓存,是 SqlSession 级别的缓存。即在同一个 SqlSession 中,查询结果会被缓存,以供后续的查询直接使用。在 MyBatis 缓存中,只默认开启一级缓存,而二级缓存需要手动配置开启。另外,一级缓存之间是互相独立的缓存空间,不能通信。

简单示例:
1.使用同一个 SqlSession 中,第一次获取查询结果后再次进行相同的查询,只执行一次 SQL 语句
在这里插入图片描述

查看日志,结果如图:
在这里插入图片描述

2.使用同一个 SqlSession 中,第一次获取查询结果后再次进行不同的查询,执行了两次 SQL 语句(缓存中没有找到对应的结果,所以执行 SQL 语句从数据库中查找数据。当然,找到后也会放入缓存中)
在这里插入图片描述

查看日志,结果如图:
在这里插入图片描述

同一个 SqlSession 下也执行了两次 SQL 语句的其他情况:
(1)使用同一个 SqlSession 中,第一次获取查询结果后再次进行相同的查询,但两次查询之间进行清空缓存(sqlSession.clearCache();)
(2)使用同一个 SqlSession 中,第一次获取查询结果后再次进行相同的查询,但两次查询之间进行增改删操作(缓存会刷新)

3.使用不同的 SqlSession 进行相同的两次查询,执行了两次 SQL 语句
在这里插入图片描述

查看日志,结果如图:
在这里插入图片描述

二级缓存

二级缓存(全局缓存),是 mapper 级别的缓存。即可以跨越多个 SqlSession ,允许在不同的 SqlSession 之间共享查询结果,但需要在 mapper 文件中进行配置。在开启二级缓存情况下,一级缓存的数据会在会话提交或关闭前转存到二级缓存中。

简单示例:
首先,手动配置开启二级缓存。这需要在全局配置文件 mybatis.xml 中的 settings 标签内添加开启配置

<!-- 开启二级缓存 -->
<setting name="cacheEnabled" value="true"/>

接着,映射文件中需要添加 < cache /> 标签

<!-- 开启二级缓存 -->
<cache />

然后,实体类必须实现序列化接口(implements Serializable)
在这里插入图片描述

最后,测试结果。使用不同的 SqlSession 进行相同的两次查询(需要 sqlSession1 关闭),执行了一次 SQL 语句
在这里插入图片描述

查看日志,结果如图:
在这里插入图片描述

开启二级缓存需要在 MyBatis 全局配置文件中配置 cacheEnabled 值为 true 。同时在映射文件中添加 < cache /> 标签。另外,在 select 标签的 useCache 属性中,默认值为 true ,开启二级缓存后,二级缓存生效;若设置为 false ,即使开启二级缓存后也会在该 select 标签中失效。而在 select 标签的 flushCache 属性中,默认值为 false ,使用所有缓存;若设置为 true ,则禁用所有缓存。但是,在增删改标签的 flushCache 属性中,默认值为 true ,执行增删改操作后刷新所有缓存。

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

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

相关文章

OpenAI接口调用示例

最近为公司做了一个ChatGPT工具&#xff0c;这里展示一下OpenAI接口的调用 前提条件 访问OpenAI官网&#xff08;国内需要翻墙&#xff09;的账号&#xff0c;需要sk 地址&#xff1a;https://platform.openai.com 依赖 使用开源工具调用OpenAI接口&#xff0c;依赖如下&am…

js中箭头函数简单介绍

1.箭头函数是 ES6 中新增的一种函数定义方式&#xff0c; 简单举例为 var nameA function(a){return a} 可以用箭头函数简化为 var nameA a >a; 返回的是你输入的值 比如 nameA(5) 返回的就是5 nameA(2) 返回的就是2 以上两个表达的含义是一样的。nameA为名字 2.…

Vue3封装一个轮播图组件

先看效果 编写组件代码 CarouselChart.vue <template><div classimg-box><el-button clickpreviousImages v-ifprops.showBtn>←</el-button><div classimg><div styledisplay: flex;gap: 20px idmove><imgclassimg-item v-for(item…

centos7部署docker

文章目录 &#xff08;1&#xff09;安装前准备&#xff08;2&#xff09;卸载旧版Docker&#xff08;3&#xff09;安装docker&#xff08;4&#xff09;配置镜像加速 &#xff08;1&#xff09;安装前准备 在开始安装之前&#xff0c;首先需要检查内核版本。使用 uname -r 命…

nodejs微信小程序+python+PHP个性化服装搭配系统APP-计算机毕业设计推荐 android

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性&#xff1a;…

redis(设置密码)配置文件详细

1.设置账号密码端口 config set requirepass 123456 设置密码为123456 config get requirepass 查看账号密码 auth 123456 登入的时候输入这个确定账号密码 1. 首先连接到Redis服务器: redis-cli 2. 然后使用CONFIG SET命令设置requirepass参数并指定密码: CONFIG SET requi…

【PyTorch】现代卷积神经网络

文章目录 1. 理论介绍1.1. 深度卷积神经网络&#xff08;AlexNet&#xff09;1.1.1. 概述1.1.2. 模型设计 1.2. 使用块的网络&#xff08;VGG&#xff09;1.3. 网络中的网络&#xff08;NiN&#xff09;1.4. 含并行连结的网络&#xff08;GoogLeNet&#xff09; 2. 实例解析2.1…

家具制造ERP软件包含哪些功能?家具制造业ERP系统哪个好

不同的家具有不同的用料、品质、制造工时、营销渠道等&#xff0c;而有些家具制造企业采用传统的管理方式在处理物料BOM、生产实际成本核算、库存盘点、供应商选择、班组计件核对、生产领用以及物料追溯等方面存在不少提升空间。 与此同时也有很多的皮具制造企业借助ERP软件优…

Linux16 ftp文件服务区、vsftpd文件系统服务安装、lftp客户端安装、NFS远程共享存储

目录 一、FTP基础ftp主动模式ftp被动模式 二、vsftpd配置共享目录编辑配置文件使用windows 访问 三、客户端安装 &#xff08;lftp&#xff09;匿名用户的一些操作&#xff08;lftp {ip}&#xff09;ftp配置本地用户登录配置本地用户ftp配置文件 lftp操作 NFS远程共享存储安装n…

新的侧通道攻击可泄露处理器的 Root 密码

阿姆斯特丹自由大学的一组科学家开发了一种名为 SLAM&#xff08;Spectre Linear Address Masking&#xff09;的侧信道攻击。 该攻击利用旨在提高新型Intel、AMD 和 Arm 处理器安全性的硬件功能&#xff0c;从内核内存中提取根密码哈希。 重现 SLAM 攻击所需的代码和所有数据…

dockerfile:创建镜像的方式,船舰自定义的镜像

dockerfile&#xff1a;创建镜像的方式&#xff0c;船舰自定义的镜像 包括配置文件&#xff0c;挂载点&#xff0c;对外暴露的端口&#xff0c;设置环境变量 docker创建镜像的方式 1、基于已有镜像进行创建。 根据官方提供的镜像源&#xff0c;创建镜像&#xff0c;然后拉起…

IP与以太网的转发操作

TCP模块在执行连接、收发、断开等各阶段操作时&#xff0c;都需要委托IP模块将数据封装成包发送给通信对象。 网络中有路由器和集线器两种不同的转发设备&#xff0c;它们在传输网络包时有着各自的分工。 (1)路由器根据目标地址判断下一个路由器的位置 (2)集线器在子网中将网…

docker的镜像创建 dockerfile

dockerfile Dokcer镜像的创建 创建镜像有三种方法&#xff0c;分别为【基于已有镜像创建】、【基于本地模板创建】以及【基于Dockerfile创建】。 &#xff08;1&#xff09;首先启动一个镜像&#xff0c;在容器里做修改 docker run -itd --name web centos:7 /bin/bash …

k8s pod日志写入ELK的具体实现

shigen坚持更新文章的博客写手&#xff0c;擅长Java、python、vue、shell等编程语言和各种应用程序、脚本的开发。记录成长&#xff0c;分享认知&#xff0c;留住感动。 在上一部分&#xff0c;shigen讲到了k8spod的日志写入ELK的三种技术方案&#xff0c;并在最后展示了一下我…

QMainWindow和QWidget有什么区别

2023年12月12日&#xff0c;周二上午 QMainWindow 和 QWidget 是 Qt 框架中两个不同的类&#xff0c;用于创建用户界面的窗口部件。它们之间的主要区别在于它们的设计和用途。 QMainWindow: QMainWindow 是用于创建主窗口的类&#xff0c;通常包含了一个应用程序的主要界面。…

NFR 数字权益开发流程

NFR 在技术开发领域通常指的是“非功能性需求”&#xff08;Non-Functional Requirements&#xff09;&#xff0c;这些是描述系统属性如安全性、性能、可用性、兼容性等方面的需求。然而&#xff0c;如果在这里 NFR 被用来指代与数字权益或非同质化代币&#xff08;NFT&#x…

C++ 构造函数 调用方法

构造函数 调用方法 //括号法&#xff08;常用&#xff09; Person p1(100); //有参构造 Person p2(p1); //拷贝构造//注意&#xff1a;不要用括号法调用无参构造&#xff0c;会和 函数声明 混淆。//显示法 Person p3 Person(); //无参构造 Person p4 Person(100); //有参构…

【USRP】LFTX / LFRX

LFTX/LFRX 设备概述 LFTX 子板利用两个高速运算放大器来允许 0-30 MHz 的传输。该板仅接受实模式信号。LFTX 非常适合 HF 频段的应用&#xff0c;或使用外部前端来上变频和放大中间信号的应用。LFTX 的输出可以独立处理&#xff0c;也可以作为单个 I/Q 对进行处理。 主要特征…

Python - 搭建 Flask 服务实现图像、视频修复需求

目录 一.引言 二.服务构建 1.主函数 upload_gif 2.文件接收 3.专属目录 4.图像修复 5.gif2mp4 6.mp42gif 7.图像返回 三.服务测试 1.服务启动 2.服务调用 四.总结 一.引言 前面我们介绍了如何使用 Real-ESRGAN 进行图像增强并在原始格式 jpeg、jpg、mp4 的基础上…

HeartBeat监控Redis状态

目录 一、概述 二、 安装部署 三、配置 四、启动服务 五、查看数据 一、概述 使用heartbeat可以实现在kibana界面对redis服务存活状态进行观察&#xff0c;如有必要&#xff0c;也可在服务宕机后立即向相关人员发送邮件通知 二、 安装部署 参照文章&#xff1a;HeartBeat监…