MyBatis缓存-提高检索效率的利器--一级缓存

😀前言
本篇博文是关于MyBatis一级缓存的介绍使用和缓存失效情况分析,希望能够帮助到您😊

🏠个人主页:晨犀主页
🧑个人简介:大家好,我是晨犀,希望我的文章可以帮助到大家,您的满意是我的动力😉😉

💕欢迎大家:这里是CSDN,我总结知识的地方,欢迎来到我的博客,感谢大家的观看🥰
如果文章有什么需要改进的地方还请大佬不吝赐教 先在此感谢啦😊

文章目录

  • MyBatis缓存-提高检索效率的利器
    • 缓存-官方文档
    • 一级缓存
      • 基本介绍
        • 基本说明
        • 一级缓存原理图
    • 一级缓存快速入门
      • 代码实现
      • 测试结果
      • Debug 一级缓存执行流程
    • 一级缓存失效分析
      • 一.关闭sqlSession 会话后
      • 二.执行sqlSession.clearCache()
      • 三.当对同一个monster 修改
    • 😄总结
    • 热门推荐

MyBatis缓存-提高检索效率的利器

缓存-官方文档

文档地址: https://mybatis.org/mybatis-3/zh/sqlmap-xml.html#cache

一级缓存

基本介绍

基本说明

  1. 默认情况下,mybatis 是启用一级缓存的/本地缓存/local Cache,它是SqlSession 级别的。
  2. 同一个SqlSession 接口对象调用了相同的select 语句,会直接从缓存里面获取,而不是再去查询数据库

一级缓存原理图

一级缓存快速入门

需求: 当我们第1 次查询id=1 的Monster 后,再次查询id=1 的monster 对象,就会直接从一级缓存获取,不会再次发出sql。

代码实现

  1. 创建新module: mybatis_cache , 必要的文件和配置直接从mybatis_quickstart module拷贝即可。
  2. 需要拷贝的文件和配置如图

在这里插入图片描述

  1. 使用MonsterMapperTest.java , 运行getMonsterById() 看看是否可以看到日志输出,结论我们多次运行,总是会发出SQL.

  2. 修改MonsterMapperTest.java, 增加测试方法, 测试一级缓存的基本使用+ Debug 源码

    //测试一级缓存
    @Test
    public void level1CacheTest() {

        //查询id=3的monster
        Monster monster = monsterMapper.getMonsterById(3);
        System.out.println("monster=" + monster);

        //再次查询id=3的monster
        //当我们再次查询 id=3的Monster时,直接从一级缓存获取,不会再次发出sql
        System.out.println("--一级缓存默认是打开的,当你再次查询相同的id时, 不会再发出sql----");
        Monster monster2 = monsterMapper.getMonsterById(3);
        System.out.println("monster2=" + monster2);

        if (sqlSession != null) {
            sqlSession.close();
        }
    }

测试结果

Debug 一级缓存执行流程

sqlSession 的结构示意图

一级缓存失效分析

一.关闭sqlSession 会话后

关闭sqlSession 会话后, 再次查询,会到数据库查询, 修改MonsterMapperTest.java, 测试一级缓存失效情况

//测试一级缓存,失效
    //关闭sqlSession会话后 , 一级缓存失效
    @Test
    public void level1CacheTest2() {

        //查询id=3的monster
        Monster monster = monsterMapper.getMonsterById(3);
        System.out.println("monster=" + monster);

        //关闭sqlSession, 一级缓存失效
        if (sqlSession != null) {
            sqlSession.close();
        }

        //因为关闭了sqlSession,所以需要重新初始化sqlSession和 monsterMapper
        sqlSession = MyBatisUtils.getSqlSession();
        monsterMapper = sqlSession.getMapper(MonsterMapper.class);
        //再次查询id=3的monster
        System.out.println("--如果你关闭了sqlSession,当你再次查询相同的id时, 仍然会发出sql----");
        Monster monster2 = monsterMapper.getMonsterById(3);
        System.out.println("monster2=" + monster2);

        if (sqlSession != null) {
            sqlSession.close();
        }
    }

二.执行sqlSession.clearCache()

当执行sqlSession.clearCache() 会使一级缓存失效,修改MonsterMapperTest.java, 测试一级缓存失效情况

//测试一级缓存,失效
    //如果执行sqlSession.clearCache() , 会导致一级缓存失效
    @Test
    public void level1CacheTest3() {

        //查询id=3的monster
        Monster monster = monsterMapper.getMonsterById(3);
        System.out.println("monster=" + monster);

        //执行clearCache
        /**
         * @Override
         *   public void clearCache() {
         *     executor.clearLocalCache();
         *   }
         */
        sqlSession.clearCache();

        //再次查询id=3的monster
        System.out.println("--如果你执行sqlSession.clearCache(),当你再次查询相同的id时, 仍然会发出sql----");
        Monster monster2 = monsterMapper.getMonsterById(3);
        System.out.println("monster2=" + monster2);

        if (sqlSession != null) {
            sqlSession.close();
        }
    }

三.当对同一个monster 修改

当对同一个monster 修改,该对象在一级缓存会失效, 修改MonsterMapperTest.java, 测试一把

 //测试一级缓存,失效
    //如果修改了同一个对象 , 会导致一级缓存[对象数据]失效
    @Test
    public void level1CacheTest4() {

        //查询id=3的monster
        Monster monster = monsterMapper.getMonsterById(3);
        System.out.println("monster=" + monster);

        //如果修改了同一个对象 , 会导致一级缓存[对象数据]失效
        monster.setName("蚂蚱精");
        monsterMapper.updateMonster(monster);

        //再次查询id=3的monster
        System.out.println("--如果你修改了同一个对象,当你再次查询相同的id时, 仍然会发出sql----");
        Monster monster2 = monsterMapper.getMonsterById(3);
        System.out.println("monster2=" + monster2);

        if (sqlSession != null) {
            sqlSession.commit();//这里需要commit
            sqlSession.close();
        }
    }

😄总结

  1. 默认情况下,mybatis 是启用一级缓存的/本地缓存/local Cache,它是SqlSession 级别的。SqlSession 会话关闭,一级缓存就结束了。
  2. 同一个SqlSession 接口对象调用了相同的select 语句,会直接从缓存里面获取,而不是再去查询数据库。
  3. 关闭SqlSession 、执行clearCache()、修改对象,都会导致缓存失效。

热门推荐

对缓存感兴趣的朋友可以看看博主的缓存篇–
MyBatis缓存-提高检索效率的利器–二级缓存

文章到这里就结束了,如果有什么疑问的地方请指出,诸大佬们一起来评论区一起讨论😁
希望能和诸大佬们一起努力,今后我们一起观看感谢您的阅读🍻
如果帮助到您不妨3连支持一下,创造不易您们的支持是我的动力🤞

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python入门【__init__ 构造方法和 __new__ 方法、类对象、类属性、类方法、静态方法、内存分析实例对象和类对象创建过程(重要)】(十四)

👏作者简介:大家好,我是爱敲代码的小王,CSDN博客博主,Python小白 📕系列专栏:python入门到实战、Python爬虫开发、Python办公自动化、Python数据分析、Python前后端开发 📧如果文章知识点有错误…

拯救者Y9000K无线Wi-Fi有时不稳定?该如何解决?

由于不同品牌路由器的性能差异,无法完美兼容最新的无线网卡技术,在连接网络时(特别是网络负载较大的情况下),可能会出现Wi-Fi信号断开、无法网络无法访问、延迟突然变大的情况;可尝试下面方法进行调整。 1…

[containerd] 在Windows上使用IDEA远程调试containerd, ctr, containerd-shim

文章目录 1. containerd安装2. 源码编译3. 验证编译的二进制文件是否含有调试需要的信息3.1. objdump工具验证3.2. file工具验证3.3. dlv工具验证 4. debug 1. containerd安装 [Ubuntu 22.04] 安装containerd 2. 源码编译 主要步骤如下: 1、从github下载containe…

八大排序算法--选择排序(动图理解)

选择排序 算法思路 每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完 。 选择排序的步骤: 1>首先在未排序序列中找到最小(大)元素…

pytorch深度学习快速入门

放弃个人素质 享受缺德人生 拒绝精神内耗 有事直接发疯 一、安装Anaconda 官网下载地址 选择适合的系统版本进行安装即可 安装完之后,可以看到下面的内容 二、使用Anaconda创建开发环境 这也是为什么要使用Anaconda的原因,可以创建不同的开发环境&am…

【ChatGPT辅助学Rust | 基础系列 | Hello, Rust】编写并运行第一个Rust程序

文章目录 前言一,创建项目二,两种编译方式1. 使用rustc编译器编译2. 使用Cargo编译 总结 前言 在开始学习任何一门新的编程语言时,都会从编写一个简单的 “Hello, World!” 程序开始。在这一章节中,将会介绍如何在Rust中编写并运…

微信小程序 居中、居右、居底和横向、纵向布局,文字在图片中间,网格布局

微信小程序居中、居右、横纵布局 1、水平垂直居中(相对父类控件)方式一:水平垂直居中 父类控件: display: flex;align-items: center;//子控件垂直居中justify-content: center;//子控件水平居中width: 100%;height: 400px //注意…

Golang Devops项目开发(1)

1.1 GO语言基础 1 初识Go语言 1.1.1 开发环境搭建 参考文档:《Windows Go语言环境搭建》 1.2.1 Go语言特性-垃圾回收 a. 内存自动回收,再也不需要开发人员管理内存 b. 开发人员专注业务实现,降低了心智负担 c. 只需要new分配内存,…

码力全开!请查收HDC.Together 2023亮点日程

<主题演讲> <技术交流与互动> <妙趣之旅> 点击关注阅读原文&#xff0c;了解更多资讯

MacOS本地安装Hadoop3

金翅大鹏盖世英&#xff0c;展翅金鹏盖世雄。 穿云燕子锡今鸽&#xff0c;踏雪无痕花云平。 ---------------- 本文密钥&#xff1a;338 ----------------- 本文描述了在macbook pro的macos上安装hadoop3的过程&#xff0c;也可以作为在任何类linux平台上安装hadoop3借鉴。 …

奥迪A3:最新款奥迪A3内饰设计及智能科技应用

奥迪A3一直以来都是奥迪的入门级车型&#xff0c;但这并不意味着它在科技和内饰方面会有所退步。最新款奥迪A3的内饰设计和智能科技应用让人们再次惊叹奥迪的创新能力。 内饰设计 奥迪A3最新款的内饰设计引入了奥迪最新的设计元素&#xff0c;比如8.8英寸的中控显示屏&#xf…

AD21 PCB设计的高级应用(四)FPGA的管脚交换功能

&#xff08;四&#xff09;FPGA的管脚交换功能 高速 PCB 设计过程中,涉及的 FPGA等可编程器件管脚繁多,也因此导致布线的烦琐与困难&#xff0c;Altium Designer 可实现 PCB 中 FPGA 的管脚交换&#xff0c;方便走线。 1.FPGA管脚交换的要求 (1)一般情况下,相同电压的 Bank之…

IT服务管理学习笔记<一>

### IT服务管理知识整理 ITSM 的核心思想是&#xff0c;IT 组织&#xff0c;不管它是企业内部的还是外部的&#xff0c;都是 IT 服务提供者&#xff0c;其 主要工作就是提供低成本、高质量的 IT 服务。 ITSM 的核心思想是&#xff0c;IT 组织&#xff0c;不管它是企业内部的还…

子域名收集工具OneForAll的安装与使用-Win

子域名收集工具OneForAll的安装与使用-Win OneForAll是一款功能强大的子域名收集工具 GitHub地址&#xff1a;https://github.com/shmilylty/OneForAll Gitee地址&#xff1a;https://gitee.com/shmilylty/OneForAll 安装 1、python环境准备 OneForAll基于Python 3.6.0开发和…

适配器模式——不兼容结构的协调

1、简介 1.1、概述 有的笔记本电脑的工作电压是20V&#xff0c;而我国的家庭用电是220V&#xff0c;如何让20V的笔记本电脑能够在220V的电压下工作&#xff1f;答案是引入一个电源适配器&#xff08;AC Adapter&#xff09;&#xff0c;俗称充电器&#xff0f;变压器。有了这…

[PAT乙级] 1029 旧键盘 C++实现

题目描述&#xff1a; 旧键盘上坏了几个键&#xff0c;于是在敲一段文字的时候&#xff0c;对应的字符就不会出现。现在给出应该输入的一段文字、以及实际被输入的文字&#xff0c;请你列出肯定坏掉的那些键。 输入格式&#xff1a; 输入在 2 行中分别给出应该输入的文字、以…

Java生成二维码——附Utils工具类

参加2023年的计算机设计大赛国赛&#xff0c;拿到了一等奖。 现在将项目中的工具类代码剥离出来&#xff0c;方便之后项目开发中复用。 实现效果&#xff1a; 代码实现&#xff1a; import com.google.zxing.BarcodeFormat; import com.google.zxing.EncodeHintType; import c…

《MySQL 实战 45 讲》课程学习笔记(二)

日志系统&#xff1a;一条 SQL 更新语句是如何执行的&#xff1f; 与查询流程不一样的是&#xff0c;更新流程还涉及两个重要的日志模块&#xff1a;redo log&#xff08;重做日志&#xff09;和 binlog&#xff08;归档日志&#xff09;。 重要的日志模块&#xff1a;redo l…

怎么通过通过 p 名称空间配置 bean以及怎么去引用/注入其它 bean 对象--ref和怎么去引用/注入内部 bean 对象-内部 bean 对象

&#x1f600;前言 本章是spring基于XML 配置bean系类中第2篇讲解怎么通过通过 p 名称空间配置 bean以及怎么去引用/注入其它 bean 对象–ref和怎么去引用/注入内部 bean 对象 &#x1f3e0;个人主页&#xff1a;尘觉主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0…

每日一题——只出现一次的数字(II)

只出现一次的数字——II 题目链接 注&#xff1a;本题的解法建立在位运算之上&#xff0c;如果对位运算不太了解&#xff0c;建议先看看&#x1f449;位运算详解 思路 可能有小伙伴做了只出现一次的数字——I后认为这题也可以用异或运算来解决&#xff0c;但是我们需要注意到…