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

news/2025/2/19 17:34:20/

文章目录

  • 缓存-提高检索效率的利器
    • 缓存-官方文档
    • 二级缓存
      • 基本介绍
      • 二级缓存原理图
    • 二级缓存快速入门
      • 快速入门
      • 注意事项和使用陷阱
        • 理解二级缓存策略的参数
      • 四大策略
      • 如何禁用二级缓存
      • mybatis 刷新二级缓存的设置

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

缓存-官方文档

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

二级缓存

基本介绍

  1. 二级缓存和一级缓存都是为了提高检索效率的技术。
  2. 最大的区别就是作用域的范围不一样,一级缓存的作用域是sqlSession 会话级别,在一次会话有效,而二级缓存作用域是全局范围,针对不同的会话都有效。

二级缓存原理图

二级缓存快速入门

快速入门

  1. mybatis-config.xml 配置中开启二级缓存
<!--引入外部的jdbc.properties--><properties resource="jdbc.properties"/><!--配置MyBatis自带的日志输出-查看原生的sql--><settings><setting name="logImpl" value="STDOUT_LOGGING"/><!--1、全局性地开启或关闭所有映射器配置文件中已配置的任何缓存, 可以理解这是一个总开关2、默认就是: true--><setting name="cacheEnabled" value="true"/></settings>
  1. 使用二级缓存时entity 类实现序列化接口(serializable),因为二级缓存可能使用到序列化技术。不一定要实现,只是有的外部缓存需要。

  1. 在对应的XxxMapper.xml 中设置二级缓存的策略

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><!--解读
    1. 这是一个mapper xml 文件
    2. 该文件可以去实现对应的接口的方法
    3. namespace 指定该xml文件和哪个接口对应!!!
    -->
    <mapper namespace="com.nlc.mapper.MonsterMapper"><!--1、配置二级缓存: 是mybatis自带2、FIFO – 先进先出:按对象进入缓存的顺序来移除它们。3. flushInterval 刷新间隔 是毫秒单位 60000 表示 60s4. size="512": 引用数目, 属性可以被设置为任意正整数, 默认10245. readOnly="true": (只读)属性可以被设置为 true 或 false: 如果我们只是用于读操作,建议设置成 true, 这样可以提示效率, 如果有修改操作,设置成 false, 默认就是false--><cache eviction="FIFO" flushInterval="60000"  size="512" readOnly="true"/></mapper>
    
  2. 修改MonsterMapperTest.java , 完成测试

       //测试二级缓存的使用@Testpublic void level2CacheTest() {//查询id=3的monsterMonster monster = monsterMapper.getMonsterById(3);System.out.println("monster=" + monster);//这里关闭sqlSessionif (sqlSession != null) {sqlSession.close();}//重新获取sqlSessionsqlSession = MyBatisUtils.getSqlSession();//重新获取了monsterMappermonsterMapper = sqlSession.getMapper(MonsterMapper.class);//再次查询id=3的monsterSystem.out.println("--虽然前面关闭了sqlSession,因为配置二级缓存, " +"当你再次查询相同的id时, 依然不会再发出sql, 而是从二级缓存获取数据----");Monster monster2 = monsterMapper.getMonsterById(3);System.out.println("monster2=" + monster2);Monster monster3 = monsterMapper.getMonsterById(3);System.out.println("monster3=" + monster3);if (sqlSession != null) {sqlSession.close();}}
    

注意事项和使用陷阱

理解二级缓存策略的参数

<cache eviction="FIFO" flushInterval="30000" size="360" readOnly="true"/>

上面的配置意思如下:
创建了FIFO 的策略,每隔30 秒刷新一次,最多存放360 个对象而且返回的对象被认为是只读的。
eviction:缓存的回收策略
flushInterval:时间间隔,单位是毫秒,
size:引用数目,内存大就多配置点,要记住你缓存的对象数目和你运行环境的可用内存
资源数目。默认值是1024
readOnly:true,只读

四大策略

√ LRU – 最近最少使用的:移除最长时间不被使用的对象,它是默认
√ FIFO – 先进先出:按对象进入缓存的顺序来移除它们。
√ SOFT – 软引用:移除基于垃圾回收器状态和软引用规则的对象。
√ WEAK – 弱引用:更积极地移除基于垃圾收集器状态和弱引用规则的对象。

如何禁用二级缓存

一、修改resources\mybatis-config.xml

<settings><setting name="logImpl" value="STDOUT_LOGGING"/><!--全局性地开启或关闭所有映射器配置文件中已配置的任何缓存, 默认就是true--><setting name="cacheEnabled" value="false"/>
</settings>

​ 二、修改mapper\MonsterMapper.xml,取消缓存

<!--<cache eviction="FIFO" flushInterval="30000" size="360" readOnly="true"/>-->

​ 三、或者更加细粒度的, 在配置方法上指定useCache=“false”

设置useCache=false 可以禁用当前select 语句的二级缓存,即每次查询都会发出sql 去查询,默认情况是true,即该sql 使用二级缓存。
注意:一般我们不需要去修改,使用默认的即可。

mybatis 刷新二级缓存的设置

可以在实现方法上配置刷新缓存:flushCache=“true”

<update id="updateMonster" parameterType="Monster" flushCache="true">
UPDATE mybatis_monster SET NAME=#{name},age=#{age} WHERE id=#{id}
</update>

insert、update、delete 操作数据后需要刷新缓存,如果不执行刷新缓存会出现脏读。
默认为true,默认情况下为true 即刷新缓存,一般不用修改。


http://www.ppmy.cn/news/993468.html

相关文章

【算法训练营】求最小公倍数+另类加法+走方格的方案数

7月31日 求最小公倍数题目题解代码 另类加法题目题解代码 走方格的方案数题目题解| 1 | 2 | 3 || 4 | 5 | 6 || 7 | 8 | 9 |代码 求最小公倍数 题目 点击跳转: 求最小公倍数 题解 最小公倍数 两数之积除以最大公约数&#xff0c;这里使用碾转相除法进行最大公约数的求解&am…

I.MX6ULL_Linux_驱动篇(41)platform设备驱动框架

我们在前面几章编写的设备驱动都非常的简单&#xff0c;都是对IO进行最简单的读写操作。像I2C、SPI、 LCD 等这些复杂外设的驱动就不能这么去写了&#xff0c; Linux 系统要考虑到驱动的可重用性&#xff0c;因此提出了驱动的分离与分层这样的软件思路&#xff0c;在这个思路下…

Linux之 centos、Ubuntu 安装常见程序

CentOS 安装 MySql 注意 需要有root权限 安装5.7版本 – 由于MySql并不在CentOS的官方仓库中&#xff0c;所以需要通过rmp命令&#xff1a; 导入MySQL仓库密钥 1、配置MySQL的yum仓库 配置yum仓库 更新密钥 rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022 安装…

quartus工具篇——fifo ip核

quartus工具篇——fifo ip核 1、简介 FPGA 中的 FIFO&#xff08;First-In, First-Out&#xff09;是一种常见的数据缓冲器&#xff0c;用于在不同的时钟域之间进行数据传输。FIFO 可以暂存一定数量的数据&#xff0c;并支持并行读取和写入操作&#xff0c;同时保持先进先出的…

SK5代理与网络安全:保障爬虫安全与效率的最佳选择

一、SK5代理和IP代理的概念及区别 SK5代理&#xff08;也称为socks5代理&#xff09;和IP代理是两种常见的代理技术。IP代理是通过代理服务器转发请求和响应&#xff0c;隐藏客户端的真实IP地址&#xff0c;从而实现匿名访问和绕过网络限制。SK5代理是一种特殊的代理协议&#…

【javascript】关于path-package

背景 一个老的vue项目&#xff0c;预览pdf文件的时候&#xff0c;电子签章不显示 解决方案 由于是老项目&#xff0c;升级版本存在风险&#xff0c;然后又找到一些解决方案&#xff0c;都是修改源码&#xff0c;修改源码就引出了今天的主题 path-package&#xff0c;我们需要…

Java课题笔记~数据库连接池

一、数据库连接池 1.1 数据库连接池简介 数据库连接池是个容器&#xff0c;负责分配、管理数据库连接(Connection) 它允许应用程序重复使用一个现有的数据库连接&#xff0c;而不是再重新建立一个&#xff1b; 释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数…

远距离传输大型文件:如何应对不同地区的网络环境和带宽约束

在现代社会中&#xff0c;远程传输大文件已经变得非常常见了。无论是个人生活还是各种组织之间的合作和协作&#xff0c;都需要频繁地进行文件传输。但是&#xff0c;由于不同地区的网络状况和带宽限制&#xff0c;传输大文件可能会遇到很多问题。因此&#xff0c;如何应对不同…