深度剖析MyBatis的二级缓存

二级缓存的原理

  • MyBatis 二级缓存的原理是什么?

    1. 二级缓存的原理和一级缓存一样,第一次查询会将数据放到 缓存 中,然后第二次查询直接去缓存读取。
    2. 但是一级缓存是基于 SqlSession 的,二级缓存是基于 mapper 的 namespace 的。
    3. 也就是说,多个 SqlSession 可以共享同一个二级缓存区域。如果两个 mapper 的 namespace 相同,那么即使是两个 mapper,这两个 mapper 执行 sql 查询的数据也将保存在相同的二级缓存区域中。

如何使用二级缓存

注意:User 需要实现序列化接口。

开启二级缓存

和一级缓存不一样,二级缓存需要手动开启。

首先在全局配置文件 sqlMapConfig.xml 中加入如下代码

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

然后在 UserMapper.xml 中开启二级缓存。

<!-- 开启二级缓存 -->
<cache />

如果是使用注解方式,在 IUserMapper​ 上写上注解 @CacheNamespace

@CacheNamespace
public interface IUserMapper {
}

测试代码

public class SecondCacheTest {private SqlSessionFactory sqlSessionFactory;@Beforepublic void before() throws Exception {InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);}@Testpublic void secondLevelCache() {SqlSession sqlSession1 = sqlSessionFactory.openSession();SqlSession sqlSession2 = sqlSessionFactory.openSession();IUserMapper userMapper1 = sqlSession1.getMapper(IUserMapper.class);IUserMapper userMapper2 = sqlSession2.getMapper(IUserMapper.class);User user1 = userMapper1.findUserById(1);// 清空一级缓存sqlSession1.close();User user2 = userMapper2.findUserById(1);System.out.println(user1 == user2);}
}

效果如下

Setting autocommit to false on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@56528192]
==>  Preparing: select * from user where id=?
==> Parameters: 1(Integer)
<==    Columns: id, username, password, birthday
<==        Row: 1, lucy, 123, 2019-12-12
<==      Total: 1
Resetting autocommit to true on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@56528192]
Closing JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@56528192]
Returned connection 1448247698 to pool.
As you are using functionality that deserializes object streams, it is recommended to define the JEP-290 serial filter. Please refer to https://docs.oracle.com/pls/topic/lookup?ctx=javase15&id=GUID-8296D8E8-2B93-4B9A-856E-0A65AF9B8C66
Cache Hit Ratio [com.terwergreen.mapper.IUserMapper]: 0.5
false

可以看到,两次请求,只有第一次输出了 sql , 并且输出了缓存命中率是 0.5 。

useCache 和 flushCache

  • useCache 用来设置是否禁用二级缓存。在 statement 中设置 useCache="false" 可以禁用当前 select 语句的 二级缓存

  • <select id="selectUserByUserId" useCache="false" resultType="space.terwer.pojo.User"
    parameterType="int">select * from user where id=#{id}
    </select>
    
  • 设置 statement 的 flushCache="true" 即 刷新缓存 ,默认情况下就是 true。因为一般不设置,默认即可

  • 注解方式的使用

    /*** 根据ID查询用户** @param id* @return*/
    @Options(useCache = false, flushCache = Options.FlushCachePolicy.TRUE)
    @Select("select * from user where id=#{id}")
    User findUserById(Integer id);
    

文章更新历史

2024/05/15 同步文章到其他平台

2022-12-25 feat: 初稿

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

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

相关文章

关于API接口的自述

在实际工作中&#xff0c;我们需要经常跟第三方平台打交道&#xff0c;可能会对接第三方平台API接口&#xff0c;或者提供API接口给第三方平台调用。 那么问题来了&#xff0c;如果设计一个优雅的API接口&#xff0c;能够满足&#xff1a;安全性、可重复调用、稳定性、好定位问…

Qt运行时,如何设置第一个聚焦的控件

问题&#xff1a;Qt第一个聚焦的控件&#xff0c;如何自行设置&#xff1f; 尝试&#xff1a; 1.在代码中设置 lineEdit->setFocus() 。无效&#xff01; 2.Qt Designer–打开form1.ui–菜单栏下一行–Edit Tab Order–按顺序点击–菜单栏下一行–Edit Widgets–退出。无效…

为什么做了功能测试还要做接口测试

接口测试与功能测试不是重复的测试,而是互为补充的测试策略。 在软件测试领域,接口测试和功能测试被视为质量保证过程中至关重要的组成部分。尽管它们之间存在部分重复,但更多的情况下,它们相辅相成,各自发挥着独特的作用。本文将探讨接口测试与功能测试之间的关系,以及它…

【easyX】动手轻松掌握easyX 1

01 简单绘图 在这个程序中&#xff0c;我们先初始化绘图窗口。其次&#xff0c;简单绘制两条线。 #include <graphics.h>//绘图库头文件 #include <stdio.h> int main() {initgraph(640, 480);//初始化640✖480绘图屏幕line(200, 240, 440, 240);//画线(200,240)…

MySQL是如何选择索引的?

2.3.5. 索引选择 MySQL是如何选择索引的&#xff1f; 优化器决定了具体某一索引的选择&#xff0c;也就是常说的执行计划。而优化器的选择是基于成本&#xff08;cost&#xff09;&#xff0c;哪个索引的成本越低&#xff0c;优先使用哪个索引。 SQL 优化器会分析所有可能的执…

Python操作鼠标键盘和爬虫

一.pyautogui 库 pyautogui 是一个 Python 库&#xff0c;允许控制鼠标和键盘。可以通过它编写 Python 脚本来自动执行各种任务&#xff0c;例如点击按钮、输入文本、移动鼠标等。这个库非常适合用来编写自动化脚本来完成重复性的工作&#xff0c;比如网页表单填写、屏幕截图、…

STC8增强型单片机开发——定时器Timer

一、定时器 定时器是一种计时装置&#xff0c;通常由一个晶体振荡器提供时钟信号&#xff0c;可以计时一定的时间后执行相应的操作。在单片机中&#xff0c;定时器一般是由计数器和时钟源组成的&#xff0c;可以用来产生一定时间间隔的中断信号&#xff0c;或者用于测量输入信号…

开放式运动耳机哪款好用?五款高性能值得信赖产品推荐

身为户外运动的达人&#xff0c;我发现开放式运动耳机简直是咱们运动时的最佳拍档&#xff0c;不管是跑步还是健身&#xff0c;开放式运动耳机最为舒适&#xff0c;它的妙处就在于不用塞进耳朵&#xff0c;这样既安全又卫生&#xff0c;户外动起来更放心。但市面上好坏参半&…

AIGC行业:探索发展风口,把握市场脉搏

AIGC行业现在适合进入吗 简介&#xff1a; AIGC行业&#xff1a;探索发展风口&#xff0c;把握市场脉搏 随着人工智能技术的快速发展&#xff0c;AIGC&#xff08;人工智能生成内容&#xff09;行业正逐渐成为科技界的新宠。在当前的时代背景下&#xff0c;我们不禁要问&…

Chisel中对对<: 和:的理解(其实是Scala中的理解)

在 Scala 语言和 Chisel 硬件构造语言中&#xff0c;<: 和 : 是用于类型注解的两个不同的符号&#xff0c;它们在泛型编程和类型系统中扮演重要角色。下面是它们各自的意义和用途&#xff1a; <:&#xff08;子类型关系&#xff09; <: 符号在 Scala 中表示子类型关…

Nginx详细介绍一

Nginx是一个高性能的HTTP和反向代理服务器&#xff0c;它也可以作为邮件服务器使用。 Nginx基本介绍 基本概念&#xff1a; Nginx可以处理大量的并发连接&#xff0c;具有很高的稳定性和低资源消耗的特点。它主要用于Web服务、反向代理、负载均衡和HTTP缓存等场景。 安装与配…

【半夜学习MySQL】内置函数(含日期、字符串、数学等函数常用用法介绍及示例详解)

&#x1f3e0;关于专栏&#xff1a;半夜学习MySQL专栏用于记录MySQL数据相关内容。 &#x1f3af;每天努力一点点&#xff0c;技术变化看得见 文章目录 日期函数字符串函数数学函数其他函数 日期函数 函数名称描述current_date()当前日期current_time()当前时间current_time()…

php8.2使用laravel V11.0

报错&#xff1a;You must enable the openssl extension in your php.ini to load information from https://mirrors.aliyun.com/composer 1、搜索&#xff1a;extension_dir去掉;号 2、搜索&#xff1a;extensionopenssl去掉;号

幻兽帕鲁Palworld服务器手动部署

目录 帕鲁官方文档手动安装steamcmd通过steamcmd安装帕鲁后端客户端连接附录&#xff1a;PalServer.sh的启动项附录&#xff1a;配置文件 帕鲁官方文档 https://tech.palworldgame.com/ 手动安装steamcmd 创建steam用户 sudo useradd -m steam sudo passwd steam下载steamc…

你写HTML的时候,会注重语义化吗?

其实说到语义化&#xff0c;多年前端开发经验的老手估计也不会太在意&#xff0c;有时候工期太紧&#xff0c;有时候自己疏忽&#xff0c;也就不那么在意了&#xff0c;直接DIVCSS一把梭下去了。 目录 什么是HTML 什么是HTML语义化 HTML语义化所带来的好处 我把CSS样式引入…

_pickle.UnpicklingError: STACK_GLOBAL requires str

导致这个报错的原因是我跑yolo的时候修改数据集了&#xff0c;里面的label.cache没有删除&#xff0c;咱只要删除掉缓存就行&#xff01;&#xff01; 我这里是已经删除掉了&#xff0c;所以图片里面没有&#xff0c;一般就是在箭头所示位置有.cache文件的

Vue3知识总结-4

Vue3知识总结-4 文章目录 Vue3知识总结-4插槽Slots渲染作用域默认内容具名插槽插槽中的数据传递具名插槽传递数据 组件声明周期声明周期示意图 组件生命周期的应用动态组件组件保持存活组件被卸载 异步组件依赖注入 插槽Slots 在某些场景中&#xff0c;可能想要为子组件传递一…

xxljob分片广播+多线程实现高效定时同步elasticsearch索引库

需求&#xff1a;为了利用elasticsearch实现高效搜索&#xff0c;需要将mysql中的数据查出来&#xff0c;再定时同步到es里&#xff0c;同时在同步过程中通过分片广播多线程提高同步数据的效率。 1. 添加映射 使用kibana添加映射 PUT /app_info_article {"mappings&quo…

HL7协议

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 1.介绍2.传输协议规范2.1. MLLP2.1.1. 数据头定义2.1.2. 转义字符集 2.2. 规范说明2.3. 消息格式说明 3.HL7结构介绍3.1. 患者建档&#xff08;ADT^A28&#xff09;…

linux c++获取当前程序的运行路径

比如我的程序名为:aaa 存放路径是:/homo/code/ 我在/home/ccc 目录执行shell文件。shell文件的内容为 #!/bin/bash /homo/code/aaa我希望获取的路径是 /homo/code/ 而不是脚本的路径 给出完整接口代码 #include <iostream> #include <string> #include <stri…