MyBatis-缓存(一级缓存、二级缓存)

news2024/11/29 0:19:23

一、缓存(Cache)

1、定义:缓存是一种用于存储数据的硬件设备存储空间(缓存不是内存)。

2、作用:减轻数据库压力,提高查询性能

3、实现原理:将从数据库中查询出来的对象/记录在使用完后不直接销毁,而是将其存储在缓存中,当需要再次获取该对象时,不再通过向数据库执行SQL语句获取,而是直接从缓存中获取,因此减少了对数据库的查询次数,提高了数据库的性能。

二、一级缓存

1、作用域:同一个SqlSession对象

2、实现原理:在使用同一个SqlSession对象多次调用同一个Mapper方法且Mapper方法中包含参数在内的SQL语句完全相同时,第一次执行完毕会将数据库中查询到的数据写到缓存中,在第二次查询时如果不对缓存进行刷新且缓存没有超时,那么第二次执行完毕会从直接从缓存中获取数据不再从数据库中进行查询,提高了对数据库的查询效率。

3、特点:

  • 当某个SqlSession对象结束时,该SqlSession对象的一级缓存也就不存在了。
  • MyBatis在默认情况下一级缓存是开启

4、生命周期:

a、MyBatis在开启一个数据数据库会话时,会创建一个SqlSession对象,该SqlSession对象中会有一个Executor对象,Executor对象中会持有一个PerpetualCache对象。如果SqlSession对象调用了close()方法,会释放掉一级缓存PerpetualCache对象该SqlSession对象的一级缓存将不可再用

b、如果SqlSession对象调用了clearCache(),会清空PerpetualCache对象中的数据,但是一级缓存依旧可用。

c、SqlSession中执行任何一个update操作(update()、delete()、insert()),都会清空一级缓存中的数据,但是一级缓存依旧可用。

5、MyBatis一级缓存的工作模式

6、SqlSession对象中的clearCache()方法

作用:清空当前SqlSession对象中的一级缓冲中的数据

三、二级缓存

1、作用域:同一个namespace

2、实现原理:两个不同的SqlSession对象执行同一个namespace下的相同Mapper方法中的包含传递参数在内的完全相同的SQL语句时,第一个SqlSession对象在执行完后会将从数据库中查询到的数据写到二级缓存中,第二个SqlSession对象在执行SQL语句时会直接从二级缓存中获取数据,提高了查询效率

3、特点:

  • MyBatis在默认情况下二级缓存是关闭的
  • 在MyBatis中开启二级缓存需要在setting全局参数中进行配置

4、二级缓存详解

(1)二级缓存是SqlSessionFactory级别的,是更具Mapper中的namespace划分区域的,相同的namespace的Mapper查询的数据缓存在同一个区域,如果使用Mapper代理方法则每个Mapper的namespace都不同,此时可以理解为二级缓存根据Mapper来划分区域。

(2)每次执行select查询语句时会先在二级缓存区域进行查找,如果找不到才会从数据库中进行查询,并将查询到的数据写入缓存。

(3)MyBatis的内部存储缓存使用了一个HashMap,key的值是hashCode+sqlId+SQL语句,value的值为由查询结果映射生成的java对象。

(4)SqlSession对象执行insert、update、delete操作comit提交后会清空二级缓冲区域,防止脏读

5、MyBatis二级缓存的工作模式

6、配置二级缓存

(1)第一步:启用二级缓存:在MyBatis核心配置文件mybatis.xml中添加指定代码

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

(2)第二步:对象序列化:所有的POJO类实现序列化接口java.io.Serializable

(3)第三步:配置映射文件:在Mapper映射文件中添加<cache/>,表示此Mapper开启二级缓存,当SqlSession对象关闭时,会将SqlSession对象的一级缓存中的数据存入到二级缓存

 7、insert标签、delete标签、update标签、select标签中的flushCache属性

(1)作用:设置所在标签中的SQL语句在被调用时是否刷新二级缓存

(2)属性值:true/false

8、cache标签中的flushInterval属性

(1)作用:在指定时间间隔刷新cache标签对应的二级缓存

(2)属性值:任意的正整数,以毫秒为单位的合理时间量

(3)特点:cache标签在默认情况下不设置时间间隔,二级缓存仅会在调用语句时刷新

9、一级缓存中的数据写入到二级缓存的时刻

只有当SqlSession对象被关闭时该SqlSession对象的一级缓存中的数据才会写入到二级缓存

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

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

相关文章

【Zookeeper】四,Zookeeper节点类型、通知、仲裁、会话

文章目录 Zookeeper的架构znode的版本Zookeeper的节点类型层级树状结构znode的不同类型 Zookeeper监视与通知通知的类型 Zookeeper的仲裁Zk的会话会话的生命周期 Zookeeper的架构 Zookeeper的服务器端运行两种模式&#xff1a;独立模式&#xff08;standalone&#xff09;和仲…

【mac】终端左边太长处理,自定义显示名称(terminal路径显示特别长)

1、打开终端 2、步骤 &#xff08;1&#xff09;修改~/.zshrc文件 nano ~/.zshrc&#xff08;2&#xff09;添加或修改PS1&#xff0c;我是自定义了名字为“macminiPro” export PS1"macminiPro$ "&#xff08;3&#xff09;使用 nano: Ctrl o &#xff08;字母…

macos 14.0 Monoma 修改顶部菜单栏颜色

macos 14.0 设置暗色后顶部菜单栏还维持浅色&#xff0c;与整体不协调。 修改方式如下&#xff1a;

树莓派3:64位系统串口(UART)使用问题的解决方法

前言 当我们要使用串口进行zigbee的短距离通信时,发现无法使用串口. 原因 树莓派3bCPU内部有两个串口,一个硬件串口(就是我们平时使用的UART),还有一个迷你串口(mini-uart),在老版本的树莓派中把硬件串口分配在GPIO上,可以单独使用.但是在新的树莓派中官方把硬件串口给了蓝牙…

前端Vue项目整合nginx部署到docker容器

一、通过Dockerfile整合nginx方法&#xff1a; 1&#xff0c;使用Vue CLI或npm脚本构建生产环境下的Vue项目。 npm run build or yarn build2&#xff0c;构建完成后&#xff0c;项目目录中会生成一个dist文件夹&#xff0c;里面包含了所有静态资源文件&#xff08;HTML、CSS…

《Vue零基础入门教程》第十课:属性绑定指令

往期内容 《Vue零基础入门教程》第一课&#xff1a;Vue简介 《Vue零基础入门教程》第二课&#xff1a;搭建开发环境 《Vue零基础入门教程》第三课&#xff1a;起步案例 《Vue零基础入门教程》第四课&#xff1a;应用实例 《Vue零基础入门教程》第五课&#xff1a;挂载 《…

计算机网络socket编程(5)_TCP网络编程实现echo_server

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 计算机网络socket编程(5)_TCP网络编程实现echo_server 收录于专栏【计算机网络】 本专栏旨在分享学习计算机网络的一点学习笔记&#xff0c;欢迎大家在评论区交…

【适配】屏幕拖拽-滑动手感在不同分辨率下的机型适配

接到一个需求是类似下图的3D多房间视角&#xff0c;需要拖拽屏幕 问题 在做这种屏幕拖拽的时候发现&#xff0c;需要拖拽起来有跟手的感觉&#xff0c;会存在不同分辨率机型的适配问题。 即&#xff1a;美术调整好了机型1的手感&#xff0c;能做到手指按下顶层地板上下挪动&…

C#调用C++ DLL方法之C++/CLI(托管C++)

托管C与C/CLI前世今生 C/CLI (C/Common Language Infrastructure) 是一种用于编写托管代码的语言扩展&#xff0c;它是为了与 .NET Framework 进行互操作而设计的。C/CLI 是 C 的一种方言&#xff0c;它引入了一些新的语法和关键字&#xff0c;以便更好地支持 .NET 类型和垃圾…

python excel接口自动化测试框架!

今天采用Excel继续写一个接口自动化测试框架。 设计流程图 这张图是我的excel接口测试框架的一些设计思路。 首先读取excel文件&#xff0c;得到测试信息&#xff0c;然后通过封装的requests方法&#xff0c;用unittest进行测试。 其中&#xff0c;接口关联的参数通过正则进…

[RabbitMQ] 重试机制+TTL+死信队列

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…

前端入门之VUE--基础与核心

前言 VUE是前端用的最多的框架&#xff1b;这篇文章是本人大一上学习前端的笔记&#xff1b;欢迎点赞 收藏 关注&#xff0c;本人将会持续更新。 Vue学习笔记 用于构建用户界面的渐进式框架 构建用户界面&#xff1a;基于数据动态渲染页面渐进式&#xff1a;循序渐近的学…

java基础知识(常用类)

目录 一、包装类(Wrapper) (1)包装类与基本数据的转换 (2)包装类与String类型的转换 (3)Integer类和Character类常用的方法 二、String类 (1)String类介绍 1)String 对象用于保存字符串,也就是一组字符序列 2)字符串常量对象是用双引号括起的字符序列。例如:&quo…

嵌入式驱动开发详解2(设备挂载问题)

文章目录 前言设备号设备号的组成设备号的分配静态分配动态分配 驱动挂载与卸载设备节点创建驱动挂载出现问题 前言 驱动的设备挂载和卸载是十分重要的内容&#xff0c;一旦操作不当可能会导致系统崩溃&#xff0c;接下来我将用字符设备的驱动挂载原理进行详细讲解&#xff0c…

谈谈微服务的常用组件

由于微服务给系统开发带来了一些问题和挑战&#xff0c;如服务调用的复杂性、分布式事务的处理、服务的动态管理等&#xff0c;为了更好地解决这些问题和挑战&#xff0c;各种微服务治理的组件应运而生&#xff0c;充当微服务架构的基石和支撑&#xff0c;常用组件如下表&#…

【数字图像处理+MATLAB】通过迭代全局阈值处理算法(Iterative Global Algorithm)实现图像分割

引言 图像分割是将数字图像划分为多个区域&#xff08;或像素的集合&#xff09;的过程&#xff0c;这些区域通常对应于真实世界的物体或图像中的特定部分。图像分割的目标是简化或改变图像的表示形式&#xff0c;使得图像更容易理解和分析。图像分割通常用于定位图像中的物体…

【三维生成】Edify 3D:可扩展的高质量的3D资产生成(英伟达)

标题&#xff1a;Edify 3D: Scalable High-Quality 3D Asset Generation 项目&#xff1a;https://research.nvidia.com/labs/dir/edify-3d demo&#xff1a;https://build.nvidia.com/Shutterstock/edify-3d 文章目录 摘要一、前言二、多视图扩散模型2.1.消融研究 三、重建模型…

在SQLyog中导入和导出数据库

导入 假如我要导入一个xxx.sql&#xff0c;我就先创建一个叫做xxx的数据库。 然后右键点击导入、执行SQL脚本 选择要导入的数据库文件的位置&#xff0c;点击执行即可 注意&#xff1a; 导入之后记得刷新一下导出 选择你要导出的数据库 右键选择&#xff1a;备份/导出、…

HDR视频技术之三:色度学与颜色空间

HDR 技术的第二个理论基础是色度学。从前面的内容中可以了解到&#xff0c;光学以及人类视觉感知模型为人类提供了解释与分析人类感知亮度的理论基础&#xff0c;但是 HDR 技术不仅仅关注于提升图像与视频的亮度范围&#xff0c;同时也关注于提供更加丰富的色彩。因此&#xff…

通信与网络安全之IPSEC

IPSec&#xff08;IP Security&#xff09;是IETF制定的为保证在Internet上传送数据的安全保密性能的三层隧道加密协议。IPSec在网络层对IP报文提供安全服务。IPSec协议本身定义了如何在IP数据包中增加字段来保证IP包的完整性、 私有性和真实性&#xff0c;以及如何加密数据包。…