Mybatis的一级、二级缓存

news/2025/2/26 21:48:14

如图所示:

Mybatis的缓存如图所示:

当数据没有改变,开启SQLsession使用SQL语句对数据进行一次查询时,会将数据进行缓存,当第二次查询同样的数据时,则命中缓存,不去查询数据库,加快查询耗时;

特点:

一级缓存、二级缓存都是基于本地缓存的一个名为PerpetualCache,它本质是一个Hashmap

一级缓存作用域是session级别,同一个session,调同一个SQL会进行缓存,默认是打开的

二级缓存作用域更广,是namespace和mapper的作用域,只要是同一个namespace或者查询同一个mapper文件(同一张表)的SQL,都会进行缓存,不依赖session,但是默认是关闭的;

一、一级缓存

1、基于一个session

基于perpetualCache的HashMap本地缓存,其作用域为Session,当Session进行flush或close之后,该Session中的所有Cache就将清空,默认打开一级缓存

java">// 获取一个sqlsession,用它来执行SQL
Sqlsession sqlsession = sqlSessionFactory.openSession();

// 执行SQL,用同一个session对象获取两次,同一笔数据,
// 得到userMapper1、userMapper2两个代理对象
UserMapper userMapper1 = sqlsession.getMapper(UserMapper.class);
UserMapper userMapper1 = sqlsession.getMapper(UserMapper.class);

// 用这两个代理对象,执行两次查询SQL,但是到数据库层面只会进行一次查询
User user = userMapper1.selectById(6);
System.out.prientln(user);

System.out.prientln("--------------------------");
User user1 = userMapper2.selectById(6);
System.out.prientln(user1);

控制台结果如下:

我们可以看到,明明调用了两次select语句,但是实际上只查询了一次数据库,证明后面一次直接走的是缓存,这就是一级缓存

因为他们用的是同一个session,走了一级缓存,用两个session就会查询两次数据库了

2、基于两个session

java">// 获取一个sqlsession,用它来执行SQL
Sqlsession sqlsession1 = sqlSessionFactory.openSession();

// 执行SQL,用同一个session对象获取两次,同一笔数据,
// 得到userMapper1代理对象
UserMapper userMapper1 = sqlsession1.getMapper(UserMapper.class);

// 用这两个代理对象,执行两次查询SQL,但是到数据库层面只会进行一次查询
User user = userMapper1.selectById(6);
System.out.prientln(user);
sqlsession1.close();

// 另外开启一个session
Sqlsession sqlsession2 = sqlSessionFactory.openSession();

System.out.prientln("--------------------------");
UserMapper userMapper2 = sqlsession2.getMapper(UserMapper.class);
User user2 = userMapper2.selectById(6);
System.out.prientln(user2);

sqlsession2.close();

控制台结果如下:

可以看到,以及缓存失效了,查询了两次数据库;

另外:当数据有过增删改等操作后,缓存就会失效,也会查两次数据库

那如果我两个session,也想使用Mybatis的缓存,可以不可以呢?

可以的,那就需要使用二级缓存了:

二、二级缓存

二级缓存也是基于perpetualCache的HashMap本地缓存,其作用域是namespace和mapper;而不是依赖于SQL session,所以范围更广

当两个session不能缓存时,我们可以手动配置开启二级缓存,使不同的session也能缓存:

开启方式,两步:

1、全局配置文件:

<settings>
    <setting name='cacheEnabled" value='true'
</settings>

2、mapper映射文件中:

使用<cache/>标签让当前mapper文件生效二级缓存

我们测试一下,还是上面那个一级缓存失效的例子:

java">// 获取一个sqlsession,用它来执行SQL
Sqlsession sqlsession1 = sqlSessionFactory.openSession();

// 执行SQL,用同一个session对象获取两次,同一笔数据,
// 得到userMapper1代理对象
UserMapper userMapper1 = sqlsession1.getMapper(UserMapper.class);

// 用这两个代理对象,执行两次查询SQL,但是到数据库层面只会进行一次查询
User user = userMapper1.selectById(6);
System.out.prientln(user);
sqlsession1.close();

// 另外开启一个session
Sqlsession sqlsession2 = sqlSessionFactory.openSession();

System.out.prientln("--------------------------");
UserMapper userMapper2 = sqlsession2.getMapper(UserMapper.class);
User user2 = userMapper2.selectById(6);
System.out.prientln(user2);

sqlsession2.close();

控制台结果如下:

手动二级缓存后,缓存生效

注意事项:

1、对于缓存数据更新机制,当某一个作用域(一级缓存Session/二级缓存namespace)的数据,进行了新增、修改、删除操作后,默认该作用域下的所有select中的缓存将被清除clear

2、二级缓存需要缓存中的数据,实现Serializable接口

3、只有会话提交或者关闭后,一级缓存中的数据才会转移到二级缓存中


http://www.niftyadmin.cn/n/5869195.html

相关文章

【C++】面试常问八股

5、内存管理 野指针 野指针指的是未进行初始化或未清零的指针&#xff0c;不是NULL指针野指针产生原因及解决方案&#xff1a; 指针变量未初始化&#xff1a;指针变量定义时若未初始化&#xff0c;则其指向的地址是随机的&#xff0c;不为NULL&#xff1b;定义时初始化为NULL…

Nmap网络安全审计

&#x1f345; 点击文末小卡片 &#xff0c;免费获取网络安全全套资料&#xff0c;资料在手&#xff0c;涨薪更快 Nmap网络安全审计 什么是Nmap Nmap是由Gordon Lyon设计并实现的&#xff0c;于1997开始发布。最初设计Nmap的目的只是希望打造一款强大的端口扫描工具。但是随着…

go基础语法

go基础语法 先下载安装go&#xff0c;然后到vscode下载go插件 1. 基础 输入输出 package main import "fmt" func main(){a:1var b2 var c int //不给初始值得标出变量类型 c3var d stringfmt.Scanf("%s",&d) //接收用户输入fmt.Printf("Hell…

vLLM专题(十三)-结构化输出(Structured Outputs)

vLLM 支持使用 outlines、lm-format-enforcer 或 xgrammar 作为引导解码的后端来生成结构化输出。本文档展示了一些可用于生成结构化输出的不同选项示例。 一、在线服务(OpenAI API) 你可以使用 OpenAI 的 Completions 和 Chat API 生成结构化输出。 支持以下参数,这些参…

结构型模式 - 代理模式 (Proxy Pattern)

结构型模式 - 代理模式 (Proxy Pattern) 代理模式是一种结构型设计模式&#xff0c;它允许通过代理对象来控制对另一个对象&#xff08;目标对象&#xff09;的访问。代理对象充当目标对象的接口&#xff0c;客户端通过代理对象间接访问目标对象。 分为两大类 静态代理&#…

互联网+房产中介+装修设计+物料市场+智能家居一体化平台需求书

一、项目概述 1.1 项目背景 随着互联网技术的飞速发展以及人们生活品质的显著提升&#xff0c;传统房产交易、装修设计、家居购物等领域暴露出诸多问题。信息不对称使得用户难以获取全面准确的信息&#xff0c;在房产交易中可能高价买入或低价卖出&#xff0c;装修时可能遭遇…

windows笔记本如何设置显示器和笔记本屏幕显示的一样

windows笔记本如何设置显示器和笔记本屏幕显示的一样 DeepSeek R1 思考 27 秒 思考过程 好的&#xff0c;用户问的是Windows笔记本如何设置显示器和笔记本屏幕显示一样。我需要先理解用户的具体需求。这里的“显示器和笔记本屏幕显示一样”可能有两种情况&#xff1a;一种是希…

数据安全_笔记系列06:数据生命周期管理(存储、传输、使用、销毁)深度解析

数据安全_笔记系列06&#xff1a;数据生命周期管理&#xff08;存储、传输、使用、销毁&#xff09;深度解析 数据生命周期管理&#xff08;存储、传输、使用、销毁&#xff09;详解 数据生命周期管理&#xff08;Data Lifecycle Management, DLM&#xff09;是围绕数据从创建…