聊聊Mybatis的缓存

news2024/12/23 19:23:45

Mybatis缓存是内存中的数据,主要是对数据库查询结果的保存,使用缓存的好处是避免频繁与数据库进行交互,提升查询的响应速度。

数据库缓存扩展

聊到Mybatis缓存。我们可以扩展聊一下MySQL缓存。MySQL缓存其实与Mybatis类似,在查询的时候都会先通过查询缓存检查一下所需的数据是否存在缓存中,如果存在缓存的话就会直接返回,这样就达到了避免频繁与数据库进行交互的目的。

数据查询流程图

在学习过程中,希望大家把知识点串起来学习,这样有助力更好的学习与理解

回归正题

Mybatis 缓存主要分 一级缓存 和 二级缓存

一级缓存

一级缓存也称为本地缓存(SqlSession),属于二级缓存的子集。与数据库同一次会话期间查询到的数据会放在本地缓存中。以后如果需要获取相同的数据,直接从缓存中拿,没必要再去查询数据库。

一级缓存的缓存数据只在SqlSession内有效,它的范围有两种 SESSION 和 STATEMENT ,默认是SESSION。如果不想使用一级缓存,可以通过下列代码配置

<setting name="localCacheScope" value="STATEMENT"/>

使用SESSION,这样每次执行完一个Mapper中的语句都会将一级缓存清除。

二级缓存

一级缓存作用域太低,如果多个SqlSession需要共享缓存,则就需要开启二级缓存。二级缓存也叫全局缓存,二级缓存是基于namespace级别的缓存,一个namespace对应一个二级缓存。二级缓存需要我们手动开启。

我们可以通过在 mybatis-config 文件中配置开启二级缓存。

查询顺序

Mybatis的查询顺序如下图

Mybatis查询顺序

我们可以根据上图大概介绍一下B的流程。

  1. 首先创建SqlSession会话查询一条数据,这条数据就会被放到当前会话的一级缓存中。

  2. 如果当前SqlSession去执行commit操作(插入,更新,删除),那么就会清空SqlSession中的一级缓存,保证缓存中始终保存的是最新的数据,避免脏读。这个时候并不会把一级缓存更新到二级缓存,这一步操作是在关闭SqlSession时触发的。

  3. 新会话查询信息,就会从二级缓存中获取数据。

注意:两次查询必须在同一个SqlSession中完成,否则将不会走Mybatis的一级缓存

相反,我们在使用Mybatis作为我们的持久层框架时,也就是上图的A流程

  1. 开启二级缓存后,会使用 CachingExecutor 装饰 Executor

  2. 进入一级缓存查询流程前先在CachingExecutor进行二级缓存的查询

  3. 如果二级缓存没有命中的话会到一级缓存中查询

  4. 最后一级缓存没有的话才会去与数据库进行查询交互

二级缓存开启后,同一个 namespace 下的所有操作语句,都影响着同一个 Cache,即二级缓存被多个 SqlSession 共享,是一个全局的变量。

MyBatis 是默认关闭二级缓存的,因为对于增删改操作频繁的话,那么二级缓存形同虚设,每次都会被清空缓存。

生命周期

一级缓存没有过期时间,只有生命周期。MyBatis在开启一个数据库会话时,会创建一个新的SqlSession对象,SqlSession对象中会有一个Executor对象,Executor对象中持有一个PerpetualCache对象。当会话结束时,SqlSession对象及其内部的Executor对象还有PerpetualCache对象也一并释放掉。

二级缓存有过期时间,但没有后台线程进行检测。需要注意的是,并不是key-value的过期时间,而是这个cache的过期时间,是flushInterval,意味着整个清空缓存cache,所以不需要后台线程去定时检测。每当存取数据的时候,都有检测一下cache的生命时间,默认是1小时,如果这个cache存活了一个小时,那么将整个清空一下。

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

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

相关文章

物联网架构实例—Ubuntu 安装MongoDB及完全卸载

1.安装1.1.导入公钥wget -qO - https://www.mongodb.org/static/pgp/server-4.4.asc | sudo apt-key add -如果收到指示gnupg未安装的错误&#xff0c;则可以先执行&#xff1a;sudo apt-get install gnupg然后再执行一次导入公钥命令&#xff1a;wget -qO - https://www.mongo…

React(coderwhy)- 08(Hooks)

认识和体验Hooks 为什么需要Hook? ◼ Hook 是 React 16.8 的新增特性&#xff0c;它可以让我们在不编写class的情况下使用state以及其他的React特性&#xff08;比如生命周期&#xff09;。 ◼ 我们先来思考一下class组件相对于函数式组件有什么优势&#xff1f;比较常见的是下…

Exynos_4412——IIC总线概述

目录 一、IIC总线概述 1.1IIC总线简介 1.2IIC总线通信过程 1.3IIC总线寻址方式 二、IIC总线信号实现 2.1起始信号与停止信号 2.2字节传送与应答 2.3同步信号 三、典型IIC时序 四、小作业 一、IIC总线概述 1.1IIC总线简介 IIC总线IIC总线是Philips公司在八十年代初推…

[VP]河南第十三届ICPC大学生程序竞赛 L.手动计算

前言 传送门 : 题意 : 给定两个椭圆 的方程 , 要求 求出椭圆并集的面积之和 思路 : 本题很显然是积分 或者 计算几何的问题 对于积分的做法, 无非就是根据积分公式求出第一象限的面积 之后拓展到后面四个象限。(奈何我懒, 连两个椭圆的焦点都不想求更别提后面的积分公式了)…

Git遇到冲突?解决也太简单了

程序员宝藏库&#xff1a;https://gitee.com/sharetech_lee/CS-Books-Store git冲突是开发过程中很难避免的&#xff0c;对很多git初学者来说也是比较有障碍和门槛的一部分知识。 我认为要想彻底理解一个问题&#xff0c;首先要清楚这个问题是怎么产生的&#xff0c;然后才可以…

大数据NiFi(八):NiFi集群页面的组件工具栏介绍

NiFi集群页面的组件工具栏介绍 一、处理器(Processor)

WebLogic-执行队列

一&#xff0c;Tuning the Application Server 二&#xff0c;执行队列 Using Work Managers to Optimize Scheduled WorkThis chapter describes how WebLogic Server 12.1.3 lets you configure how your application prioritizes the execution of its work using a Work Ma…

java实现pdf转word,解决个别排版错乱问题

项目中要实现客户上传完pdf&#xff0c;上传成功后直接就转成word格式的&#xff0c;之前网上一些免费的转出来的word大致还行&#xff0c;但是有些排版就错乱了&#xff0c;如下图:下面这个是用java改造后的&#xff0c;效果如下&#xff0c;排版整齐&#xff0c;和pdf中的格式…

[总结] DDPM Diffusion模型各阶段训练和采样过程方案细节和代码逻辑汇总

DDPM Diffusion模型训练和采样过程细节汇总算法回顾框架理解DDPM训练过程采样过程Text-guiled DDPM训练过程采样过程Null-text guiled DDPM训练过程采样过程项目代码训练过程![在这里插入图片描述](https://img-blog.csdnimg.cn/f6213f8e584b4142b0c5a016cd23b63a.png)采样过程…

c++ std::funciona代替函数指针——结合std::bind

一、介绍std::function std::function是函数模板类&#xff08;是一个类&#xff09;。包含在#include <functional> 中。以前没有这个类的时候&#xff0c;我们在想定义一个回调函数指针&#xff0c;非常的麻烦。我们通常这样的定义&#xff1a; typedef void&#x…

智能小便冲洗器行业市场运行态势及未来发展潜力分析

2023-2029年中国智能小便冲洗器行业市场运行态势及未来发展潜力报告报告编号&#xff1a;1690632免费目录下载&#xff1a;http://www.cninfo360.com/yjbg/jdhy/cwjd/20230105/1690632.html本报告著作权归博研咨询所有&#xff0c;未经书面许可&#xff0c;任何组织和个人不得以…

Python人工智能之人脸识别face_recognition安装

face_recognition 模块使用系统环境搭建 系统环境 Ubuntu / deepin操作系统Python 3.6pycharm 开发工具 开发环境配置&#xff0c;安装各种系统包 人脸检测基于dlib&#xff0c;dlib依赖Boost和cmake 在windows中如果要使用dlib还是比较麻烦的&#xff0c;如果想省时间可以在…

【关于Linux中----文件系统、inode、软硬链接和动静态库】

文章目录一、理解文件系统和inode二、硬链接与软链接三、动静态库3.1、静态库与动态库3.2、生成静态库3.3、生成动态库一、理解文件系统和inode 在我前几篇博客中谈到的有关文件的话题&#xff0c;它们统一指的都是打开的文件&#xff0c;那么在这里&#xff0c;我要谈一下没有…

Java基础之《netty(22)—netty编码解码机制》

一、编码和解码的基本介绍 1、编写网络应用程序时&#xff0c;因为数据在网络中传输的都是二进制字节码数据&#xff0c;在发数据时就需要编码&#xff0c;接收数据时就需要解码 2、codec&#xff08;编解码器&#xff09;的组成部分有两个&#xff1a;decoder&#xff08;解…

看小红书排行榜,解构热点背后的出圈密码

导语&#xff1a; 随着消费升级&#xff0c;新中式茶饮也悄然“起风了”&#xff0c;传统茶从老一辈人的茶杯里&#xff0c;通过创新再造&#xff0c;成为年轻人的社交“新”头好&#xff0c;其衍生的“围炉煮茶”更成为小红书平台的热门话题。高流量曝光之路背后&#xff0c;…

一个精美的登录界面原来是这样做的

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 秩沅 原创 收录于专栏 玩归玩闹归闹&#xff0c;别拿java开玩笑 —————————————————— ⭐相关文章⭐ -通过窗口看…

隐形纱窗行业市场经营管理及发展趋势研究分析

2023-2029年中国隐形纱窗行业市场经营管理及发展趋势研究报告报告编号&#xff1a;1690619本报告著作权归博研咨询所有&#xff0c;未经书面许可&#xff0c;任何组织和个人不得以任何形式复制、传播或输出中华人民共和国境外。任何未经授权使用本报告的相关商业行为都将违反《…

【操作系统】计算机内存管理

1.内存管理目标rom-ram &#xff08;1&#xff09;为啥要做内存管理 计算机不可能所以用户进程和系统所需要的全部程序和数据放入主存&#xff0c;所以操作系统必须对内存空间进行合理有效的分配内存管理功能 内存分配回收&#xff1a;主存储器&#xff08;物理内存&#xff…

UOS系统启动盘制作

UOS系统启动盘制作一、统信启动盘制作工具1、UOS系统1&#xff09;在启动器打开启动盘制作工具![在这里插入图片描述](https://img-blog.csdnimg.cn/d51bf22e25a846cdb99f7f6317e9447f.png)2&#xff09;选择镜像3&#xff09;选择优盘并格式化4&#xff09;开始制作5&#xff…

第06章 面向对象编程(基础部分oop)

1、单独用变量来解决&#xff1a;不利于数据的管理, 把猫的三个属性拆开了。 2、使用数组的方式解决&#xff1a; 数据类型体现不出来&#xff0c;由于数组中的类型是一致的&#xff0c;所有不能体现出不同的数据类型。 只能通过下标的方式获取信息&#xff0c;这样会造成变量…