mybatis 数据库缓存的原理

MyBatis 是一个流行的 Java 持久层框架,它封装了 JDBC,使数据库交互变得更简单、直观。MyBatis 支持两级缓存:一级缓存(Local Cache)和二级缓存(Global Cache),通过这两级缓存可以有效地减少数据库的访问次数,提高应用性能。

一级缓存(Local Cache)

一级缓存是指 MyBatis 默认的缓存,其作用域为 SqlSession。每当一个 SqlSession 被创建时,一个新的一级缓存也会被创建。这意味着,所有在同一个 SqlSession 中执行的查询,都会使用这个缓存。如果同一个 SqlSession 中执行了两次相同的 SQL 查询,第一次执行后的查询结果会被放在一级缓存中,第二次查询就会直接从缓存中获取结果,不需要再去查询数据库。

一级缓存的生命周期与 SqlSession 的生命周期相同,当 SqlSession 被关闭时,其对应的一级缓存也就消失了。

需要注意的是,如果在两次相同查询之间执行了增删改操作(这些操作可能会改变数据),MyBatis 会清空缓存,以确保缓存中存储的是最新的数据。

二级缓存(Global Cache)

与一级缓存不同,二级缓存的作用域不是 SqlSession 而是 Mapper 的命名空间。这意味着,来自不同 SqlSession 的相同命名空间的相同查询可以共享缓存数据。

二级缓存需要进行显式的配置才能使用。在 MyBatis 配置文件中开启二级缓存,并在需要使用二级缓存的 Mapper 文件中添加相应配置。开启后,查询结果会被缓存,并且在多个 SqlSession 间共享。

二级缓存比一级缓存拥有更广的作用范围,但也因此涉及更多的管理和维护工作,比如处理缓存同步的问题。为确保数据的一致性,当有增删改操作时,MyBatis 会清空受影响的二级缓存区域。

缓存的原理简述

  1. 查询过程:当执行查询时,MyBatis 首先查找一级缓存,如果没有找到,再去查找二级缓存;如果两级缓存都没有命中,才会执行 SQL 查询数据库。
  2. 更新过程:当执行增删改操作时,为维护数据的一致性,MyBatis 会清空一级缓存和受影响的二级缓存。

通过以上机制,MyBatis 的缓存能够有效地减少数据库的访问次数,从而提高应用的性能。然而,需要合理地配置和使用缓存,避免因缓存数据过期或不一致而引发的问题。

在实际项目中使用 MyBatis 二级缓存时,需要通过一些配置和步骤来开启和使用。以下是使用 MyBatis 二级缓存的一般步骤:

步骤 1:依赖引入

确保你的项目中引入了 MyBatis 和对应的缓存实现库。如果使用的是 Maven,可以在 pom.xml 中添加如下依赖(版本号仅供参考,使用时请选用适当的版本):

xml复制代码

<!-- MyBatis -->
<dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.6</version>
</dependency><!-- 使用EhCache作为二级缓存实现 -->
<dependency><groupId>org.mybatis.caches</groupId><artifactId>mybatis-ehcache</artifactId><version>1.2.0</version>
</dependency>

步骤 2:MyBatis 配置文件中开启二级缓存

在 MyBatis 的全局配置文件(mybatis-config.xml)中添加二级缓存的配置。需要设置 cacheEnabled 属性为 true,这个属性默认为 true,但最好在配置文件中明确指出。

xml复制代码

<configuration><settings><!-- 开启全局二级缓存,默认为true --><setting name="cacheEnabled" value="true"/></settings>
</configuration>

步骤 3:在 Mapper.xml 中配置二级缓存

在你希望启用二级缓存的 Mapper.xml 文件中添加 <cache> 标签。例如:

xml复制代码

<mapper namespace="com.example.mapper.UserMapper"><!-- 开启这个Mapper的二级缓存 --><cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true"/><!-- Mapper接口方法的定义 -->
</mapper>
  • eviction:缓存的回收策略,如 LRU(最近最少使用的)、FIFO(先进先出)等。
  • flushInterval:缓存刷新间隔,单位毫秒。
  • size:引用数目,缓存中对象的最大数量。
  • readOnly:是否只读。只读缓存会给所有调用者返回缓存对象的相同实例,因此它们不应该修改这些对象。

步骤 4:实体类序列化

由于二级缓存数据需要在不同的会话之间共享,MyBatis 会将缓存数据序列化后存储。因此,对应的实体类需要实现 java.io.Serializable 接口:

java复制代码

public class User implements Serializable {private static final long serialVersionUID = 1L;// 类的属性和方法
}

注意事项

  1. 二级缓存的使用场合:二级缓存适用于读多写少的情况,如果业务场景中数据频繁变动,可能导致缓存频繁失效,反而降低性能。
  2. 数据一致性:在使用二级缓存时,应注意缓存数据的一致性问题。在进行数据更新操作后,需要合理地清理相关缓存,避免出现脏读。
  3. 缓存策略的选择:可以根据实际需求选择合适的缓存回收策略和缓存配置。

通过以上步骤和注意事项,可以在实际项目中有效地配置和使用 MyBatis 的二级缓存,从而提高应用的性能。

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

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

相关文章

Javaweb之SpringBootWeb案例之自动配置案例的自定义starter测试的详细解析

3.2.4.3 自定义starter测试 阿里云OSS的starter我们刚才已经定义好了&#xff0c;接下来我们就来做一个测试。 今天的课程资料当中&#xff0c;提供了一个自定义starter的测试工程。我们直接打开文件夹&#xff0c;里面有一个测试工程。测试工程就是springboot-autoconfigurat…

常见排序算法解析

芝兰生于深林&#xff0c;不以无人而不芳&#xff1b;君子修道立德&#xff0c;不为穷困而改节 文章目录 插入排序直接插入排序希尔排序 选择排序直接选择排序堆排序 交换排序冒泡排序快速排序优化挖坑法前后指针法非递归版 归并排序递归非递归 总结 插入排序 插入排序&#…

Nginx使用—基础应用

Nginx日志配置 1.mkdir /etc/nginx/logs2.server{listen 80;server_name nrj.test.com;access_log logs/acess-test.log; #正确日志error_log logs/error-test.log; #错误日志root /www;index index.html; } Nginx目录索引 语法&#xff1a;autoindex on | off 默认&#x…

【编程小记】在Windows下使用C/C++代码判断一个文件是否被其他进程占用

在Windows下使用C/C代码判断文件是否被占用 一、原理二、函数简单介绍三、实例代码 一、原理 在Windows下有一个Windows API叫做CreateFile&#xff0c;通过这个接口我们可以创建或打开文件&#xff0c;我们打开文件时可以采用独占模式进行打开&#xff0c;如果能够打开文件说…

Word Game

题目链接&#xff1a;Problem - C - Codeforces 解题思路&#xff1a; 用map存字母和出现的次数&#xff0c;然后遍历三个字母数组&#xff0c;如果map值为1&#xff0c;则加三分&#xff0c;为2加1分&#xff0c;否则不加分。 下面是c代码&#xff1a; #include<iostrea…

第41期 | GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区&#xff0c;集成了生成预训练Transformer&#xff08;GPT&#xff09;、人工智能生成内容&#xff08;AIGC&#xff09;以及大语言模型&#xff08;LLM&#xff09;等安全领域应用的知识。在这里&#xff0c;您可以找…

Linux学习-二级指针的使用

目录 ###指针传参时要用二级指针 ###函数体内部想要修改函数外部指针变量值的时候需要使用二级指针(指针变量的地址) ###指针传参时要用二级指针 char *str[5]; int Fun(char **ppstr,int len); ###函数体内部想要修改函数外部指针变量值的时候需要使用二级指针(指针变量的…

#微信小程序创建(获取onenet平台数据)

1.IDE&#xff1a;微信开发者工具 2.实验&#xff1a;创建一个小程序&#xff08;http get获取onenet平台数据&#xff09; 3.记录&#xff1a; 百度网盘链接&#xff1a;https://pan.baidu.com/s/1eOd-2EnilnhPWoGUMj0fzw 提取码: 2023 &#xff08;1&#xff09;新建一个工…

【C++STL详解 —— string类】

【CSTL详解 —— string类】 CSTL详解 —— sring类一、string的定义方式二、string的插入三、string的拼接四、string的删除五、string的查找六、string的比较七、string的替换八、string的交换九、string的大小和容量十、string中元素的访问十一、string中运算符的使用十二、…

2024年腾讯云发红包了,可用于抵扣订单金额,你们领了吗?

在2024年腾讯云新春采购节优惠活动上&#xff0c;可以领取新年惊喜红包&#xff0c;打开活动链接 https://curl.qcloud.com/oRMoSucP 会自动弹出红包领取窗口&#xff0c;如下图&#xff1a; 腾讯云2024新春采购节红包领取 如上图所示&#xff0c;点击“领”红包&#xff0c;每…

回溯算法01-组合(Java)

1.组合 题目描述 给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;n 4, k 2 输出&#xff1a; [[2,4],[3,4],[2,3],[1,2],[1,3],[1,4]]示例 2&#xff1a; 输入&#x…

VMware虚拟机安装Centos7图解,提供软件包镜像(详细安装,小白入门必看)

目录 1. 安装vmware软件 2. 下载centos7镜像 3. 使用镜像安装centos操作系统 3.1 创建新的虚拟机 3.2 开机安装系统 4. 尝试网络连通性 5. 配置静态ip地址 1. 安装vmware软件 下载链接&#xff08;包含激活码&#xff09;&#xff1a;VMware https://www.alipan…

C语言初学10:共同体

一、共同体作用 提供一种在相同内存位置存储不同数据类型的有效方式 二、共同体定义 union [union tag] //tag是可选参数 {member definition;member definition;...member definition; } [one or more union variables]; // 共同体变量是可选的 三、共同体占用空间大小 #…

vCity 2.8 – 在线浏览器元宇宙游戏平台(虚拟现实网页游戏平台)可获取现实金钱对接贝宝

vCity Nulled 是一个采用最新网络技术开发的在线浏览器游戏平台。vCity Free Download Scripts 是多功能游戏脚本&#xff0c;可帮助您根据自己的喜好创建自己的在线浏览器游戏&#xff0c;因为它有许多选项和设置&#xff0c;可以通过这些选项和设置来修改和创建您想要的浏览器…

亚信安慧AntDB:编织数据丝路,缔造创新篇章

亚信安慧AntDB作为一款具备国产化升级改造经验的数据库系统&#xff0c;在15年的平稳运行中积累了丰富经验。通过持续的创新和技术进步&#xff0c;AntDB不断优化性能和功能&#xff0c;满足用户的需求&#xff0c;与国际先进数据库系统保持竞争力。 AntDB秉承着与用户和行业保…

【广度优先搜索】【堆】【C++算法】407. 接雨水 II

作者推荐 【二分查找】【C算法】378. 有序矩阵中第 K 小的元素 本文涉及知识点 广度优先搜索 堆 LeetCoce407. 接雨水 II 给你一个 m x n 的矩阵&#xff0c;其中的值均为非负整数&#xff0c;代表二维高度图每个单元的高度&#xff0c;请计算图中形状最多能接多少体积的雨…

使用MockJS模拟数据,如何获取入参?

场景描述 在使用MockJS进行模拟数据的时候&#xff0c;会遇到一种场景&#xff0c;当参数1时&#xff0c;展示A类数据&#xff0c;当参数B时&#xff0c;展示B类数据&#xff0c;为了实现这场景&#xff0c;那就要在模拟数据时拿到请求参数&#xff1f; 实现逻辑 mock方法的…

遇见未来的你——陪伴是最长情的告白

目录 一、背景介绍二、思路&方案三、过程1.家庭中彼此的陪伴最长情2.事业中与合伙人与同事与朋友与产品的陪伴最长情3.人生中与计划与落实与啊哈的陪伴最长情4.肉体与灵魂分分合合的体验 四、总结 一、背景介绍 人有时候一转身就是一辈子&#xff0c;所以珍惜转身的每一个…

项目一:踏上Java开发之旅(2023软件1班)

文章目录 一、实战概述二、实战步骤任务1&#xff1a;安装配置JDK开发第一个Java程序1、安装JDK2、配置Java环境变量3、开发第一个Java程序&#xff08;1&#xff09;编写源程序 - HelloWorld.java&#xff08;2&#xff09;编译成字节码文件 - HelloWorld.class&#xff08;3&…

vulhub中ThinkPHP5 5.0.23 远程代码执行漏洞复现

ThinkPHP是一款运用极广的PHP开发框架。其5.0.23以前的版本中&#xff0c;获取method的方法中没有正确处理方法名&#xff0c;导致攻击者可以调用Request类任意方法并构造利用链&#xff0c;从而导致远程代码执行漏洞。 环境启动后&#xff0c;访问http://your-ip:8080即可看到…