当前位置: 首页 > news >正文

MyBatis的缓存,一级缓存,二级缓存

10、MyBatis的缓存

10.1、MyBatis的一级缓存

一级缓存是SqlSession级别的,通过同一个SqlSession对象 查询的结果数据会被缓存,下次执行相同的查询语句,就 会从缓存中(缓存在内存里)直接获取,不会重新访问数据库(数据库在磁盘里),也就是说就执行一次sql。一级缓存 默认开启

使一级缓存失效的四种情况:

  1. 不同的SqlSession对应不同的一级缓存

  2. 同一个SqlSession但是查询条件不同

  3. 同一个SqlSession两次查询之间执行了任意的增删改操作 。

    因为任意一次增删改操作会清空所有SqlSession的所有缓存---为什么?因为任意一次增删改可能会导致缓存的数据与增删改后的数据库中的数据不一致,我们肯定要以数据库中的为准,这是mybatis的机制,自动完成清空缓存。

  4. 同一个SqlSession两次查询期间手动清空了缓存

    sqlSession.clearCache();//手动清空一级缓存。一级缓存是sqlSession级别的

例子:

10.2、MyBatis的二级缓存

二级缓存是SqlSessionFactory级别,通过同一个SqlSessionFactory创建的SqlSession对象 查询的结果会被 缓存;此后若再次执行相同的查询语句,结果就会从缓存中获取 。二级缓存不是默认开启的,开启需满足条件。

二级缓存开启的条件:

a>在核心配置文件中,设置全局配置属性cacheEnabled=“true”,默认为true,不需要设置

b>在映射文件中设置标签 <cache>

c>二级缓存必须在SqlSession关闭或提交之后有效

d>查询的数据所转换的实体类类型必须实现序列化的接口

使二级缓存失效的情况:

两次查询之间执行了任意的增删改操作,会使一级和二级缓存同时失效

咱自己创建的sqlSessionUtil工具类,每调一次,都新建一个SqlSessionFactory,然后再新建一个sqlSession。要想测试二级缓冲,可以自己直接写,不使用工具类。

    @Testpublic void testCache2() throws IOException {InputStream is = Resources.getResourceAsStream("mybatis-config.xml");//创建SqlSessionFactoryBuilder对象SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();//通过核心配置文件所对应的字节输入流创建工厂类SqlSessionFactory,生产SqlSession对象SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);SqlSession sqlSession1 = sqlSessionFactory.openSession(true);CacheMapper mapper1 = sqlSession1.getMapper(CacheMapper.class);Emp emp1 = mapper1.getEmpByEmpId(1);sqlSession1.close();System.out.println(emp1);SqlSession sqlSession2 = sqlSessionFactory.openSession(true);CacheMapper mapper2 = sqlSession2.getMapper(CacheMapper.class);Emp emp2 = mapper2.getEmpByEmpId(1);System.out.println(emp2);sqlSession2.close();}
Emp要实现序列化
映射文件里要加一个<cache>标签

10.3、二级缓存的相关配置

了解

在mapper配置文件中添加的cache标签可以设置一些属性:

①eviction属性:缓存回收策略,默认的是 LRU。

LRU(Least Recently Used) – 最近最少使用的:移除最长时间不被使用的对象。

FIFO(First in First out) – 先进先出:按对象进入缓存的顺序来移除它们。

SOFT – 软引用:移除基于垃圾回收器状态和软引用规则的对象。

WEAK – 弱引用:更积极地移除基于垃圾收集器状态和弱引用规则的对象。

②flushInterval属性:刷新间隔,单位毫秒 默认情况是不设置,也就是没有刷新间隔,缓存仅仅调用语句时刷新

③size属性:引用数目,正整数 代表缓存最多可以存储多少个对象,太大容易导致内存溢出

④readOnly属性:只读, true/false

true:只读缓存;会给所有调用者返回缓存对象的相同实例。因此这些对象不能被修改。这提供了 很重 要的性能优势。

false:读写缓存;会返回缓存对象的拷贝(通过序列化)。这会慢一些,但是安全,因此默认是 false。

10.4、MyBatis缓存查询的顺序

二级缓存的范围大于一级缓存的范围,也就是说,二级缓存中的数据要多于一级缓存中的。因为一个SqlSessionFactory可以对应多个SqlSession,而一个一级缓存只对应一个SqlSession。但是,SqlSession关闭之后,一级缓存中的数据才会写入二级缓存,所以,当SqlSession还没有关闭时,二级缓存中没有一级缓存中的一些数据,此时二级缓存可能没被命中,则查一级,若一级没命中(之前没有写入过一级缓存),则查数据库

查询顺序:2 ---> 1 ----> 数据库

先查询二级缓存,因为二级缓存中可能会有其他程序已经查出来的数据,可以拿来直接使用。

如果二级缓存没有命中,再查询一级缓存

如果一级缓存也没有命中,则查询数据库

SqlSession关闭之后,一级缓存中的数据才会写入二级缓存

相关文章:

MyBatis的缓存,一级缓存,二级缓存

10、MyBatis的缓存 10.1、MyBatis的一级缓存 一级缓存是SqlSession级别的&#xff0c;通过同一个SqlSession对象 查询的结果数据会被缓存&#xff0c;下次执行相同的查询语句&#xff0c;就 会从缓存中&#xff08;缓存在内存里&#xff09;直接获取&#xff0c;不会重新访问…...

GitLab(1)——GitLab安装

目录 一、使用设备 二、使用rpm包安装 Gitlab国内清华源下载地址&#xff1a; ①下载命令如下&#xff1a; ②安装命令如下&#xff1a; ③删除rpm包 ④配置 ⑤重载 ⑥重启 ⑦配置自启动 ⑧打开8989端口并重启防火墙 三、GitLab登录 ①访问GitLab的URL ②输入用户…...

退税政策线上VR互动科普展厅为税收工作带来了强大活力

缴税纳税是每个公民应尽的义务和责任&#xff0c;由于很多人缺乏专业的缴税纳税操作专业知识和经验&#xff0c;因此为了提高大家的缴税纳税办事效率和好感度&#xff0c;越来越多地区税务局开始引进VR虚拟现实、web3d开发和多媒体等技术手段&#xff0c;基于线上为广大公民提供…...

centos 7.9离线安装wget

1.下载安装包 登录到wget官网上下载最新的wget的rpm安装包到本地 http://mirrors.163.com/centos/7/os/x86_64/Packages/ 2.上传安装包到服务器 3.安装 rpm -ivh wget-1.14-18.el7_6.1.x86_64.rpm 4.查看版本 wget -V...

【Java学习之道】网络编程的基本概念

引言 这一章我们将一同进入网络编程的世界。在开始学习网络编程之前&#xff0c;我们需要先了解一些基本概念。那么&#xff0c;我们就从“什么是网络编程”这个问题开始吧。 一、网络编程的基本概念 1.1 什么是网络编程 网络编程&#xff0c;顾名思义&#xff0c;就是利用…...

Restful API 设计示例

Restful API 设计示例 一 &#xff0c;HTTP状态码 ✔️正例&#xff1a; 200: 返回成功 说明&#xff1a;200表示成功&#xff0c;4xx表示客户端异常&#xff0c;5xx表示服务端异常&#xff0c;参见HTTP 的返回码含义 ❌反例&#xff1a; 除了200就是500 说明&#xff1…...

为知笔记一个日记模板

<!DOCTYPE HTML><html><head> <meta http-equiv"Content-Type" content"text/html; charsetunicode"> <title>日记&#xff1a;</title><style id"wiz_custom_css">html, .wiz-editor-body {font-siz…...

软件测试中如何测试算法?

广义的算法是指解决问题的方案,小到求解数学题,大到制定商业策略,都可以叫做算法。而我们 今天讨论的软件测试中的算法,对应的英文单词为Algorithm ,专指计算机处理复杂问题的程序或 指令。 随着最近几年人工智能等领域的快速发展,算法受到前所未有的重视,算法测试也随之兴起。…...

CMOS图像传感器——Sony Ta-Kuchi图像传感器

2023 年国际图像传感器研讨会于 5 月在苏格兰克里夫举行,第四场会议重点关注汽车传感器,汽车应用中 CMOS 图像传感器 (CIS) 的技术要求与消费(移动)设备中的要求不同。毕竟,很少有人关心车载摄像头的像素数或图像美观度。主要驱动因素是安全性、可靠性和成本。 而汽车领域…...

一文理解登录鉴权(Cookie、Session、Jwt、CAS、SSO)

1 前言 登录鉴权是任何一个网站都无法绕开的部分&#xff0c;当系统要正式上线前都会要求接入统一登陆系统&#xff0c;一方面能够让网站只允许合法的用户访问&#xff0c;另一方面&#xff0c;当用户在网站上进行操作时也需要识别操作的用户&#xff0c;用作后期的操作审计。…...

LangChain结合milvus向量数据库以及GPT3.5结合做知识库问答之一 --->milvus的docker compose安装

https://github.com/milvus-io/milvus/releaseshttps://github.com/milvus-io/milvus/releases 以下步骤均在Linux环境中进行&#xff1a; 将milvus-standalone-docker-compose.yml下载到本地。 1、新建一个目录milvus 2、将milvus-standalone-docker-compose.yml放到milvu…...

安装nginx,配置https,并解决403问题

nginx安装 下载nginx&#xff1a;下载地址 上传到/opt目录 解压nginx&#xff0c;并进入解压后到目录 cd /opt tar -zxvf nginx-1.25.2.tar.gz cd nginx-1.25.2编译(with-http_ssl_module为https模块) ./configure --with-http_ssl_module安装 make install默认的安装目录为…...

RustDay04------Exercise[11-20]

11.函数原型有参数时需要填写对应参数进行调用 这里原先call_me函数没有填写参数导致报错 添加一个usize即可 // functions3.rs // Execute rustlings hint functions3 or use the hint watch subcommand for a hint.fn main() {call_me(10); }fn call_me(num: u32) {for i i…...

【Python第三方包】快速获取硬件信息和使用情况(psutil、platform)

文章目录 前言一、psutil包1.1 安装psutil包1.2 psutil 使用方式获取CPU使用率获取内存使用情况将内存的获取的使用情况变成GB和MB获取磁盘使用情况磁盘内存进行转换获取网络信息网络info 二、platform2.1 platform的介绍2.2 platform 使用方式获取操作系统的名称获取架构的名称…...

数据结构与算法课后题-第五章(哈夫曼树和哈夫曼编码)

文章目录 选择题1选择题2选择题3选择题4选择题5选择题6选择题7应用题7 选择题1 选择题2 选择题3 需要深究 选择题4 选择题5 选择题6 选择题7 应用题7...

07测试Maven中依赖的范围,依赖的传递原则,依赖排除的配置

依赖的特性 scope标签在dependencies/dependency标签内,可选值有compile(默认值),test,provided,system,runtime,import compile&#xff1a;在项目实际运行时真正要用到的jar包都是以compile的范围进行依赖 ,比如第三方框架SSM所需的jar包test&#xff1a;测试过程中使用的j…...

科技为饮食带来创新,看AI如何打造智能营养时代

在当今社会&#xff0c;快节奏的生活方式、便捷的食品选择以及现代科技的快速发展正深刻地重塑着我们对健康的认知和实践&#xff0c;它已经不再仅仅是一个话题&#xff0c;而是一个备受关注的社会焦点。在这个纷繁复杂的交汇点上&#xff0c;AI技术的介入为我们开辟了前所未有…...

软件测试知识库+1,5款顶级自动化测试工具推荐和使用分析

“工欲善其事必先利其器”&#xff0c;在自动化测试领域&#xff0c;自动化测试工具的核心地位不容置疑的。目前市面上有很多可以支持接口测试的工具&#xff0c;在网上随便一搜就可以出来很多&#xff0c;利用自动化测试工具进行接口测试&#xff0c;可以很好的提高测试效率&a…...

代码随想录算法训练营第23期day22|669. 修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树

目录 一、&#xff08;leetcode 669&#xff09;修剪二叉搜索树 二、&#xff08;leetcode 108&#xff09;将有序数组转换为二叉搜索树 三、&#xff08;leetcode 538&#xff09;把二叉搜索树转换为累加树 一、&#xff08;leetcode 669&#xff09;修剪二叉搜索树 力扣题…...

IDEA中创建Web工程流程

第一步&#xff1a;File--》New--》Project 第二步&#xff1a;填写信息&#xff0c;点击Create 第三步&#xff1a;点击File,点击Project Structure 出现该界面 选择相应的版本&#xff0c;这里我用jdk17&#xff0c;点击apply &#xff0c;点击ok 第三步&#xff1a;右键文件…...

如何高效配置阅读APP书源:完整指南助你轻松获取全网小说资源

如何高效配置阅读APP书源&#xff1a;完整指南助你轻松获取全网小说资源 【免费下载链接】Yuedu &#x1f4da;「阅读」自用书源分享 项目地址: https://gitcode.com/gh_mirrors/yu/Yuedu 还在为找不到心仪的小说而烦恼吗&#xff1f;想要打造属于自己的个性化阅读环境吗…...

餐饮排烟5大误区,避开少走弯路

做餐饮这些年&#xff0c;见过太多后厨排烟出问题的门店。每家厨房格局、业态不同&#xff0c;排烟遇到的麻烦也五花八门。结合实操经验&#xff0c;整理出餐饮排烟最容易踩的 5 个坑&#xff0c;附上实用解决办法&#xff0c;看完能避开不少问题。一、居民区门店&#xff1a;大…...

基于LoRA与SFT技术构建中文大语言模型:从词表扩展到指令微调实战

1. 项目概述&#xff1a;为什么我们需要中文专属的大语言模型底座&#xff1f; 如果你在过去一年里尝试过用开源的大语言模型&#xff08;LLM&#xff09;来处理中文任务&#xff0c;大概率会遇到过这样的尴尬&#xff1a;模型对英文指令理解得很好&#xff0c;但一换成中文&am…...

告别‘鬼影’与模糊:深入解读RangeNet++如何用高效kNN后处理搞定LiDAR语义分割的边界难题

RangeNet&#xff1a;用GPU加速的kNN后处理破解LiDAR语义分割的边界模糊难题 当自动驾驶车辆以每小时60公里的速度行驶时&#xff0c;每100毫秒的决策延迟意味着1.67米的盲区——这恰好是许多交通事故发生的临界距离。在LiDAR语义分割领域&#xff0c;传统方法在点云投影与反投…...

企业出海聘用海外员工该怎么挑选靠谱名义雇主服务商?

很多企业出海初期&#xff0c;都会卡在海外员工聘用这一步&#xff1a;没有海外实体&#xff0c;没法合法签合同、缴社保&#xff0c;想找名义雇主服务商&#xff0c;又怕选到不靠谱的&#xff0c;踩坑又不合规。结合我这几年帮出海企业对接服务商的经验&#xff0c;今天不玩虚…...

PADS Layout老手进阶:Gerber文件生成背后的‘负片’、‘钻孔图’与制造工艺解读

PADS Layout老手进阶&#xff1a;Gerber文件生成背后的‘负片’、‘钻孔图’与制造工艺解读 在PCB设计领域&#xff0c;Gerber文件是连接设计与制造的桥梁。对于使用PADS Layout的中高级工程师而言&#xff0c;仅仅掌握操作步骤远远不够。当面对四层或以上的复杂PCB板&#xff…...

书成紫微动,律定凤凰驯:你以为的巧合,是海棠山铁哥命格自带的文脉伏笔

书成紫微动 律定凤凰驯 ——海棠山铁哥文脉天命长卷南北朝庾信《周宗庙歌皇夏》 “书成紫微动&#xff0c;律定凤凰驯。”千年古句&#xff0c;庙堂雅颂&#xff0c;定格文德盛世之至高格局。 世人皆叹海棠山铁哥与这句谶语的严丝合缝&#xff0c;却鲜有人知&#xff1a; 所有…...

Python语法进阶篇 --- 单例模式、魔法方法

Python语法进阶篇 --- 单例模式、魔法方法前置补充内容单例模式魔法方法&#x1f439;&#x1f439;&#x1f439;&#x1f439;&#x1f439;一只正在努力学习计算机技术的小仓鼠&#x1f439;&#x1f439;&#x1f439;&#x1f439;&#x1f439; 前置补充内容 一个对象的实…...

2026 国产桌面 AI 智能体横向评测:博云 BoClaw vs AutoClaw vs QClaw vs MaxClaw vs WorkBuddy

一、引言2026 年初&#xff0c;一款名为 OpenClaw 的开源 AI 智能体框架以创纪录的速度蹿红全球——短短数月突破 30 万 GitHub Star&#xff0c;Token 使用量一度占据 OpenRouter 平台总量的约 13%。它之所以引发轰动&#xff0c;核心在于首次让 AI 真正实现从“动口”到“动手…...

CircuitPython内存优化:冻结模块原理与嵌入式开发实践

1. 项目概述&#xff1a;当微控制器项目撞上内存墙在嵌入式开发的世界里&#xff0c;尤其是玩转像Adafruit Circuit Playground Express这类资源受限的微控制器时&#xff0c;我们常常会与一个无形的“天花板”迎头相撞——内存限制。你可能正兴致勃勃地为你的智能徽章或互动艺…...