Mybatis缓存机制详解与实例分析

前言:
本篇文章主要讲解Mybatis缓存机制的知识。该专栏比较适合刚入坑Java的小白以及准备秋招的大佬阅读。

如果文章有什么需要改进的地方欢迎大佬提出,对大佬有帮助希望可以支持下哦~

小威在此先感谢各位小伙伴儿了😁

在这里插入图片描述

以下正文开始

Mybatis缓存概述

在这里插入图片描述

Mybatis的缓存分为一级缓存和二级缓存。一级缓存是SqlSession级别的,主要用于减少同一个SqlSession中相同的查询语句执行的次数;而二级缓存是mapper级别的,多个SqlSession可以共享一个UserMapper的二级缓存

一级缓存

首先先详细介绍一下一级缓存。

一级缓存是默认开启的,不需要我们开发者特别配置。当使用SqlSession进行查询时,如果下一次再使用相同的SqlSession进行查询,就会直接从缓存中取数据,如果没有才从数据库中取数据。

那么一级缓存是如何失效的呢?

当执行增删改操作(insert、update、delete)时,会清空一级缓存,因为增删改操作可能会改变数据库中的数据,为了保证数据的一致性,需要清空缓存

二级缓存

接着我们学习一下二级缓存。

二级缓存需要我们手动开启和配置。在mapper.xml文件中添加标签,就可以开启二级缓存。对于使用注解的mapper,我们在接口上使用@CacheNamespace注解也可以启用二级缓存。

那么二级缓存共享可以共享吗?

二级缓存是mapper级别的,多个SqlSession是可以共享同一个mapper的二级缓存。这样可以减少跨SqlSession中相同的查询语句执行的次数,进一步提高性能。

缓存实例分析

接下来我们通过一个之前课设的例子来深入理解Mybatis的缓存机制。

首先,我们需要创建一个实体类User,如下:

public class User {private int id;private String name;private String email;// 此处省略了getter和setter方法
}

接着,我们需要创建一个UserMapper接口,如下:

public interface UserMapper {List<User> selectUsers(); // 默认返回全部用户信息
}

然后在对应的MyBatis配置文件中添加一个使用一级缓存的SQL语句:

<select id="selectUsers" resultType="com.example.demo.model.User">SELECT * FROM users WHERE is_delete=0
</select>

然后在Mapper接口中使用该SQL语句,并且在调用方法前面添加一行代码,用来开启一级缓存:

public class UserService {@Cacheable("userList") // 使用一级缓存的示例,执行完毕后自动清除数据到二级缓存中。若不需要将结果存储到二级缓存中,可以在@Cacheable注解中添加key属性为null即可。例如:@Cacheable(key = "userList")public List<User> selectUsers() {return userMapper.selectUsers(); // 默认返回全部用户信息}
}

我们这个例子介绍了如何使用一级缓存。二级缓存的使用相对复杂一些,需要考虑更多的问题和情况。同时也要注意一些细节问题,比如当一个Mapper有多个SqlStatement时,默认只有一个被应用到二级缓存中,如果有多个需要执行相同Sql语句的情况(比如对多个不同的结果集进行合并),需要手动配置多个不同的SqlStatement对应不同的二级缓存名称。

同时我们也要注意数据一致性问题,避免在多个SqlSession之间产生冲突。

注意事项

除了上面所说的之外,还需要注意这些问题:

  • 脏读问题:由于缓存的存在,可能会导致脏读问题。即当数据库中的数据已经改变,但缓存中的数据还未更新时,读取到的将是旧的数据。因此,在使用缓存时,需要注意数据的实时性和一致性
  • 缓存策略选择:一级缓存和二级缓存各有优缺点,需要根据我们的实际应用场景和需求进行选择。对于读多写少的应用,可以更多地使用二级缓存;对于读写都比较频繁的应用,可能需要慎用缓存,避免数据的不一致性。

文章到这里就先结束了,感兴趣的可以订阅专栏哈,后续会继续分享相关的知识点。

在这里插入图片描述

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

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

相关文章

Jenkins安装与设置(插件安装失败,版本问题解决)

早期的使用docker安装jenkins的方法会出现插件无法安装的问题&#xff0c;是由于docker拉取的jenkins版本太低了 jdk安装 Linux系统安装JDK1.8 详细流程 maven安装&#xff1a; centos7下安装Maven 使用docker进行安装jenkins&#xff1a; 先把镜像和容器卸干净 docker ps -a…

AIKit v4.11.0 – WordPress AI 自动编写器、聊天机器人、写作助手和内容重定向器 / OpenAI GPT 插件

AIKit v4.11.0&#xff1a;WordPress的AI革命 一、引言 AIKit v4.11.0是一款为WordPress用户精心设计的强大插件&#xff0c;该插件集成了OpenAI的GPT-3技术&#xff0c;为用户提供了前所未有的AI写作和聊天机器人功能。此版本的推出&#xff0c;将WordPress的功能扩展到了全新…

智能安全配电装置在临时展会场所中的应用

贾丽丽 安科瑞电气股份有限公司 上海嘉定 201801 【摘要】简述了商场临时展会、展摊等场所中电气装置用电的特性&#xff0c;针对此类场所中隐含的电气安全隐患问题&#xff0c;结合智能安全配电装置的功能&#xff0c;从用电设备的接地、线路的安装与敷设、设备的维护和管理…

ios开发及上架

iOS证书的分类&#xff1a; 开发者证书&#xff08;Development Certificate&#xff09;&#xff1a;用于在开发阶段对应用程序进行签名和验证。开发者证书只能在开发者模式下使用&#xff0c;无法发布到App Store。 发布证书&#xff08;Distribution Certificate&#xff…

Linux free命令使用教程(free指令)(查看内存、系统内存、内存占用、内存使用情况)

文章目录 Linux free命令使用教程1. free命令简介2. free命令选项2.1 显示单位&#xff08;free -b、free -k、free -m、free -g&#xff09;2.2 使用人类可读的格式&#xff08;free -h&#xff09;2.3 显示总计数&#xff08;free -t&#xff09;2.4 连续监视内存使用 3. 解析…

【AI】使用阿里云免费服务器搭建Langchain-Chatchat本地知识库

书接上文&#xff0c;由于家境贫寒的原因&#xff0c;导致我本地的GPU资源无法满足搭建Langchain-Chatchat本地知识库的需求&#xff0c;具体可以看一下这篇文章&#xff0c;于是我只能另辟蹊径&#xff0c;考虑一下能不能白嫖一下云服务器资源&#xff0c;于是去找网上找&…

【C++】并发:异步操作

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍并发&#xff1a;异步操作。 学其所用&#xff0c;用其所学。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xff0c;下次更新不…

MySQL定时备份实现

一、备份数据库 –all-databases 备份所有数据库 /opt/mysqlcopy/all_$(date “%Y-%m-%d %H:%M:%S”).sql 备份地址 docker exec -it 容器名称 sh -c "mysqldump -u root -ppassword --all-databases > /opt/mysqlcopy/all_$(date "%Y-%m-%d %H:%M:%S").sq…

查看mysql sql执行器优化后的sql

EXPLAIN EXTENDED select s.* from student s where s.sid in ( select sid from sc where sc.cid 0 and sc.score 100); show WARNINGS;

Mysql数据库(1)

目录 一.操作系统 二.数据库mysql 对象&#xff1a; 库 -> 表 -> 二维表格形式的结构化数据 常用的数据类型&#xff1a; MySQL的六大约束属性&#xff1a; SQL语句 &#xff1a;DDL DML DQL DCL 三.mysql的基础操作 查看当前服务器中的数据库 查看当前服务器中…

Unity | 渡鸦避难所-4 | 镜头跟随角色移动

1 Cinemachine 简介 在第一人称视角的游戏中&#xff0c;摄像机需要时刻跟随角色移动。除了手动计算摄像机的位置、旋转外&#xff0c;也可以使用 Unity 提供的 Cinemachine 插件来轻松实现摄像机的控制 Cinemachine 是一套用于操作 Unity 相机的模块&#xff0c;解决了跟踪目…

看了一眼“国内外最新网络安全发展动态”,头疼....

今天给大家同步一下国内外最新网络安全发展动态 &#xff01; 国内动态&#xff1a; 商务部等12部门联合印发《关于加快生活服务数字化赋能的指导意见》 12月20日消息&#xff0c;近日&#xff0c;经国务院批准&#xff0c;商务部等12部门联合印发《关于加快生活服务数字化赋…