十一.MyBatis的缓存

11.1缓存介绍

为什么使用缓存?

        使用缓存的主要原因是为了提高应用程序的性能和响应速度。缓存可以存储经常访问的数据或计算结果,从而避免重复进行相同的计算或查询数据库等耗时的操作。通过使用缓存,你可以减少对原始数据源的访问次数,从而降低网络和数据库的负载,提高应用程序的响应速度和吞吐量。

Mybatis中的一级缓存和二级缓存?

        一级缓存:也称为 SqlSession 级别的缓存,它是默认启用的,并且会缓存所有的查询操作。一级缓存是基于 SqlSession 的,也就是说,只要在同一个 SqlSession 中,相同的查询就会被缓存。一级缓存的生命周期与 SqlSession 相同,当 SqlSession 被关闭或者清空时,一级缓存就会失效。

        二级缓存:也称为 Mapper 级别的缓存,它可以在多个 SqlSession 或者应用程序之间共享数据。要启用二级缓存,需要在 MyBatis 的全局配置文件中进行设置。二级缓存的生命周期与 Mapper 相同,当 Mapper 被重新加载或者关闭时,二级缓存就会失效。

        一级缓存和二级缓存的主要区别在于它们的范围和生命周期。一级缓存仅在同一个 SqlSession 中有效,而二级缓存在多个 SqlSession 或者应用程序之间共享数据。因此,二级缓存需要谨慎使用,因为它可能会引起数据不一致的问题。

11.2.一级缓存

11.2.1.mapper

public interface UserDao {
    //根据id查询用户信息
    public User findUserById(Integer id);

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.by.dao.UserDao">
    <select id="findUserById" resultType="User" parameterType="int">
        select * from user where id=#{id}
    </select>
</mapper>

11.2.2.测试一级缓存

    @Test
    public void testFindUserById() throws Exception{
        SqlSession sqlSession1 = sqlSessionFactory.openSession();
        UserDao userDao = sqlSession1.getMapper(UserDao.class);
        User user1 = userDao.findUserById(41);//执行查询
        System.out.println("第一次查询:" + user1);
        User user2 = userDao.findUserById(41);//不执行查询
        System.out.println("第二次查询:" + user2);

        SqlSession sqlSession2 = sqlSessionFactory.openSession();
        userDao = sqlSession2.getMapper(UserDao.class);
        User user3 = userDao.findUserById(41);//执行查询
        System.out.println("第三次查询:" + user1);
    }

 

11.2.3.一级缓存的分析

         一级缓存是SqlSession范围的缓存,当调用SqlSession的commit(),close()等方法时,就会清空一级缓存。

  1. 第一次发起查询用户id为 1 的用户信息,先去找缓存中是否有id为 1 的用户信息,如果没有,从数据库查询用户信息。 得到用户信息,将用户信息存储到一级缓存中。

  2. 如果sqlSession去执行 commit操作(执行插入、更新、删除),清空 SqlSession 中的一级缓存,这样做的目的为了让缓存中存储的是最新的信息,避免脏读

  3. 第二次发起查询用户id为1的用户信息,先去找缓存中是否有id为1的用户信息,缓存中有,直接从缓存中获取用户信息。

11.2.4.测试清空一级缓存

    @Test
    public void testFindUserById() throws Exception{
        UserDao userDao = sqlSession.getMapper(UserDao.class);
        User user1 = userDao.findUserById(41);//执行查询
        System.out.println("第一次查询:" + user1);
        User user2 = userDao.findUserById(41);//不执行查询
        System.out.println("第二次查询:" + user2);
        sqlSession.commit();
        
        User user3 = userDao.findUserById(41);//执行查询
        System.out.println("第三次查询:" + user1);
    } 

11.3.二级缓存

11.3.1.pojo

        注意:当我们在使用二级缓存时,所缓存的类一定要实现java.io.Serializable接口,这种就可以使用序列化方式来保存对象  

 

public class User implements Serializable {

    private Integer id;
    private String username;
    private String password;
    private Date birthday;
    private String sex;
    private String address;
    //set get... ...
}    

11.3.2.开启二级缓存

在mybatis-config.xml 文件全局开启二级缓存  

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

配置相关的Mapper映射文件局部开启二级缓存  

<mapper namespace="com.by.dao.UserDao">
    <!-- 开启二级缓存的支持 -->
    <cache></cache> 

11.3.3.测试二级缓存

    @Test
    public void testSecondUserById(){
        SqlSession sqlSession1 = sqlSessionFactory.openSession();
        UserDao userDao = sqlSession1.getMapper(UserDao.class);
        User user1 = userDao.findUserById(41);//执行查询
        System.out.println("第一次查询:" + user1);
        sqlSession1.commit();//二级缓存在sqlSession.commit()或者sqlSession.close()之后生效

        SqlSession sqlSession2 = sqlSessionFactory.openSession();
        UserDao userDao2 = sqlSession2.getMapper(UserDao.class);
        User user2 = userDao2.findUserById(41);//不执行查询
        System.out.println("第二次查询:" + user2);
    }

 

11.3.4.二级缓存分析

        二级缓存是mapper映射级别的缓存,多个SqlSession去操作同一个Mapper映射的sql语句,多个SqlSession可以共用二级缓存,二级缓存是跨SqlSession的。  

11.3.5.测试清空二级缓存

    @Test
    public void testSecondUserById(){
        SqlSession sqlSession1 = sqlSessionFactory.openSession();
        UserDao userDao = sqlSession1.getMapper(UserDao.class);
        User user1 = userDao.findUserById(43);//执行查询
        System.out.println("第一次查询:" + user1);
        sqlSession1.commit();

        SqlSession sqlSession3 = sqlSessionFactory.openSession();
        UserDao userDao3 = sqlSession3.getMapper(UserDao.class);
        userDao3.deleteUserById(41);
        sqlSession3.commit();

        SqlSession sqlSession2 = sqlSessionFactory.openSession();
        UserDao userDao2 = sqlSession2.getMapper(UserDao.class);
        User user2 = userDao2.findUserById(43);不执行查询
        System.out.println("第二次查询:" + user2);
        sqlSession2.commit();
        sqlSession2.close();
    }

 

 

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

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

相关文章

[oracle数据库]dblink的使用

在 Oracle 中&#xff0c;使用数据库链接&#xff08;Database Link&#xff0c;简称 dblink&#xff09;可以在一个数据库中访问另一个数据库中的对象。通过数据库链接&#xff0c;您可以在当前数据库会话中访问远程数据库中的表、视图、存储过程等对象&#xff0c;就像它们是…

2022年山东省职业院校技能大赛高职组云计算赛项试卷第二场-容器云

2022年山东省职业院校技能大赛高职组云计算赛项试卷 目录 【赛程名称】云计算赛项第二场-容器云 需要竞赛软件包以及资料可以私信博主&#xff01; 【赛程名称】云计算赛项第二场-容器云 【赛程时间】2022-11-27 09:00:00至2022-11-27 16:00:00 说明&#xff1a;完成本任务…

【流复制环境PostgreSQL-14.1到PostgreSQL-16.1大版本升级】

PostgreSQL大版本会定期添加新特性&#xff0c;这些新特性通常会改变系统表的布局&#xff0c;但内部数据存储格式很少改变。pg_upgrade通过创建新的系统表和重用旧的用户数据文件来执行快速升级。 pg_upgrade升级主要有三种用法&#xff1a; 1、使用pg_upgrade拷贝升级。 2、…

【工具】windeployqt 在windows + vscode环境下打包

目录 0.背景简介 1.windeployqt简介 2.打包具体过程 1&#xff09;用vscode编译&#xff0c;生成Release文件夹&#xff08;也有Debug文件夹&#xff0c;但是发布版本一般都是用Release&#xff09; 2&#xff09;此时可以看下Release文件夹内&#xff0c;一般是.exe可执行…

【学习笔记】Java函数式编程03 Stream流-终结操作

书接上回 3.3.3 终结操作 3.3.3.1 forEach 对集合的每一个元素进行处理 接触很多了不赘述 3.3.3.2 count 用来获取当前流中的元素的个数 比如&#xff0c;打印出所有作家的作品的总数 System.out.println(authors.stream().flatMap(author -> author.getBooks().stre…

Linux安装Python3.12.0

我们这里按照最新的Python3.12.0为示例 下载源文件。 wget https://www.python.org/ftp/python/3.12.0/Python-3.12.0.tgz解压。 tar -zxvf Python-3.12.0.tgz进入文件夹。 cd Python-3.12.0指定安装目录。 ./configure --prefix/usr/local/python3.12/编译&#xff0c;把…

文献研读|Prompt窃取与保护综述

本文介绍与「Prompt窃取与保护」相关的几篇工作。 目录 1. Prompt Stealing Attacks Against Text-to-Image Generation Models&#xff08;PromptStealer&#xff09;2. Hard Prompts Made Easy: Gradient-Based Discrete Optimization for Prompt Tuning and Discovery&#…

汽车零配件装配产线中使用RFID技术和不使用RFID技术的优缺点

汽车零配件装配产线中使用RFID技术和不使用RFID技术的优缺点 RFID(射频识别技术)是非接触式自动识别技术&#xff0c;经常被使用于工业制造、物流管理、仓储物品盘点等领域。我们聊一聊在汽车零配件装配产线中使用和不使用RFID技术的优缺点 在汽车零配件装配线使用RFID技术可以…

Java解决数组的度问题

Java解决数组的度问题 01 题目 给定一个非空且只包含非负数的整数数组 nums&#xff0c;数组的 度 的定义是指数组里任一元素出现频数的最大值。 你的任务是在 nums 中找到与 nums 拥有相同大小的度的最短连续子数组&#xff0c;返回其长度。 示例 1&#xff1a; 输入&…

.NetCore NPOI 读取excel内容及单元格内图片

由于数据方提供的数据在excel文件中不止有文字内容还包含图片信息&#xff0c;于是编写相关测试代码&#xff0c;读取excel文件内容及图片信息. 本文使用的是 NPOI-2.6.2 版本&#xff0c;此版本持.Net4.7.2;.NetStandard2.0;.NetStandard2.1;.Net6.0。 测试文档内容&#xf…

[足式机器人]Part4 南科大高等机器人控制课 CH11 Bascis of Optimization

本文仅供学习使用 本文参考&#xff1a; B站&#xff1a;CLEAR_LAB 笔者带更新-运动学 课程主讲教师&#xff1a; Prof. Wei Zhang 课程链接 &#xff1a; https://www.wzhanglab.site/teaching/mee-5114-advanced-control-for-robotics/ 南科大高等机器人控制课 Ch11 Bascis o…

前端axios与python库requests的区别

当涉及到发送HTTP请求时&#xff0c;Axios和Python中的requests库都是常用的工具。下面是它们的详细说明&#xff1a; Axios&#xff1a; Axios是一个基于Promise的HTTP客户端&#xff0c;主要用于浏览器和Node.js环境中发送HTTP请求。以下是Axios的一些特点和用法&#xff1…

Python获取指定文件夹中的所有文件名脚本

1.获取指定文件夹中的所有文件名 要获取指定文件夹中的所有文件名&#xff0c;您可以使用 os.listdir 函数来列出文件夹中的所有文件和文件夹&#xff0c;然后使用 os.path.isfile 函数来过滤出仅为文件的项。示例代码&#xff1a; import osdef get_file_names(folder_path)…

linux 中 ext2文件系统实现

ext2文件系统结构 图片的svg下载链接&#xff08;图中关于buffer的部分&#xff0c;上下两部分是重复的&#xff0c;是从不同维度下看的buffer结构&#xff09; linux内核本身不提供ext2文件系统的格式化功能&#xff0c;可以参考busybox中对mkfs.ext2的实现&#xff08;mkfs.…

sheng的学习笔记-【中】【吴恩达课后测验】Course 4 -卷积神经网络 - 第二周测验

课程4_第2周_测验题 目录 第一题 1.在典型的卷积神经网络中&#xff0c;随着网络的深度增加&#xff0c;你能看到的现象是&#xff1f; A. 【  】 n H n_H nH​和 n W n_W nW​增加&#xff0c;同时 n C n_C nC​减少 B. 【  】 n H n_H nH​和 n W n_W nW​减少&#x…

【论文笔记】Run, Don’t Walk: Chasing Higher FLOPS for Faster Neural Networks

论文地址&#xff1a;Run, Dont Walk: Chasing Higher FLOPS for Faster Neural Networks 代码地址&#xff1a;https://github.com/jierunchen/fasternet 该论文主要提出了PConv&#xff0c;通过优化FLOPS提出了快速推理模型FasterNet。 在设计神经网络结构的时候&#xff…

性能优化,让用户体验更加完美(渲染层面)

前言 上一篇我们已经围绕“网络层面”探索页面性能优化的方案&#xff0c;接下来本篇围绕“浏览器渲染层面”继续开展探索。正文开始前&#xff0c;我们思考如下问题&#xff1a; 浏览器渲染页面会经过哪几个关键环节&#xff1f;“渲染层面”的优化从哪几方面着手&#xff1f…

初试Kafka

Kafka 是一个分布式流处理平台&#xff0c;通常用作消息中间件&#xff0c;它可以处理大规模的实时数据流。以下是从零开始使用 Kafka 作为消息中间件的基本教程&#xff1a; 步骤 1: 下载和安装 Kafka 访问 Apache Kafka 官方网站&#xff1a;Apache Kafka下载最新的 Kafka …

【Redis】一文掌握Redis原理及常见问题

Redis是基于内存数据库&#xff0c;操作效率高&#xff0c;提供丰富的数据结构&#xff08;Redis底层对数据结构还做了优化&#xff09;&#xff0c;可用作数据库&#xff0c;缓存&#xff0c;消息中间件等。如今广泛用于互联网大厂&#xff0c;面试必考点之一&#xff0c;本文…

2022年山东省职业院校技能大赛高职组云计算赛项试卷第三场-公有云

2022年山东省职业院校技能大赛高职组云计算赛项试卷 目录 2022年职业院校技能大赛高职组云计算赛项试卷 【赛程名称】云计算赛项第三场-公有云 【任务1】公有云服务搭建[10分] 【适用平台】华为云 【题目1】私有网络管理[0.5分] 【题目2】云实例管理[0.5分] 【题目3】数…