MyBatis中一级缓存和二级缓存详解

mybatis的一级缓存和二级缓存 一、什么是缓存 缓存是存在于内存中的临时数据。 使用缓存减少和数据库的交互次数,提高执行效率。 1、适用于缓存 经常查询并且不经常改变的; 数据的正确与否对最终结果影响不大的; 2、不适用于缓存 经常改变的数据; 数据的正确与否对最终结果影响很大的; 例如:商品的库存,银行的汇率,股市的牌价; 二、mybatis一级缓存 1、一级缓存简介 一级缓存作用域是sqlsession级别的,同一个sqlsession中执行相同的sql查询(相同的sql和参数),第一次会去查询数据库并写到缓存中,第 阅读详情

缓存的作用

首先缓存的合理使用是优化中最常见的,将从数据库中查询出来的数据放入缓存中,下次使用时不必从数据库查询,而是直接从缓存中读取,避免频繁操作数据库,减轻数据的压力,同时提高系统性能。

为什么需要缓存

BS架构里面,用户的所有操作都是对数据库的增删改查,其中查询的操作是最多的,但如果用户想要某个数据时每次都去数据库查询,这无疑会增加数据库的压力,而且获取时间效率也会降低,所以为了解决这些问题,缓存应用而生,使用了缓存之后,服务器只需要查询一次数据库,然后将数据保存到服务器主机的内存中,以后读取时就直接取内存中的数据,而不需要每次都查数据库,这种方案除了降低数据库压力之外,还提高了响应速度,简直一箭双雕哇~

一级缓存

一级缓存是SqlSession级别的缓存,在操作数据库时需要构造SqlSession对象,在对象中有一个数据结构用于存储缓存数据。不同的sqlSession之间的缓存数据区域是互相不影响的。也就是他只能作用在同一个sqlSession中,不同的sqlSession中的缓存是互相不能读取的。

一级缓存的工作原理:
一级缓存默认是开启的,它在一个sqlSession会话里面的所有查询操作都会保存到缓存中,一般来说一个请求中的所有增删改查操作都是在同一个sqlSession里面的,所以我们可以认为每个请求都有自己的一级缓存,如果同一个sqlSession会话中2 个查询中间有一个 insert 、update或delete 语句,那么之前查询的所有缓存都会清空;
在这里插入图片描述

在这里插入图片描述

1、用户发起查询请求,查询某条数据,sqlSession先去缓存中查找,是否有该条数据,如果有,则读取并返回;如果没有,则需要从数据库中查询,并将查询到的数据放入到一级缓存区域,供下次查找使用。

2、sqlSession执行增删改操作并执行commit操作,则会清空缓存,这样做的目的是避免脏读。

3、如果commit不清空缓存,会有以下场景:A查询了某商品库存为10件,并将10件库存的数据存入缓存中,之后被客户买走了10件,数据被delete了,但是下次查询这件商品时,并不从数据库中查询,而是从缓存中查询,就会出现错误。

4、示例代码

public static void main(String[] args) throws IOException {
 
        // 加载mybatis配置文件
        Reader reader = Resources.getResourceAsReader("config/configuration.xml");
        //创建数据工厂
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        SqlSessionFactory sqlSessionFactory = builder.build(reader);
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
 
 
        // 获取mapper接口对象
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
 
        // 查询第一次
        User user = mapper.selectByPrimaryKey("3rfrf34r34");
        // 第二次查询
        User user1 = mapper.selectByPrimaryKey("3rfrf34r34");
        System.out.println("两个user对象是否相等:"+(user == user1));
        //释放会话
        sqlSession.clearCache();
        sqlSession.close();
    }

打印结果:
在这里插入图片描述
根据结果可以看到,代码中执行了2次查询, 但实际运行时只查询了一次数据库,第二次获取数据时直接从缓存中读取,并且2次读取的数据都是一样的,到这里,一级缓存就已经生效了;
接下来我们来测试第二种情况 :查询 -> 修改 -> 查询
示例代码:

public static void main(String[] args) throws IOException {
 
        // 加载mybatis配置文件
        Reader reader = Resources.getResourceAsReader("config/configuration.xml");
        //创建数据工厂
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        SqlSessionFactory sqlSessionFactory = builder.build(reader);
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
 
 
        // 获取mapper接口对象
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        // 查询第一次
        User user = mapper.selectByPrimaryKey("3rfrf34r34");
        
        // 修改
        mapper.updateByPrimaryKey(user);
        // 第二次查询
        User user1 = mapper.selectByPrimaryKey("3rfrf34r34");
        System.out.println("两个user对象是否相等:"+(user == user1));
        //释放会话
        sqlSession.clearCache();
        sqlSession.close();
    }

打印结果:
在这里插入图片描述
控制台打印了三次sql,其中第一个查询和第三个查询是一样的,但是并没有使用缓存**,是因为每次增删改操作都有可能会改变原来的数据,所以必须刷新缓存**。

二级缓存

二级缓存是mapper级别的缓存,多个SqlSession去操作同一个Mapper的sql语句,多个SqlSession可以共用二级缓存,二级缓存是跨SqlSession的。二级缓存的作用范围更大。

二级缓存流程图:

在这里插入图片描述

第一种配置方式

单个mapper配置,主需要在需要开启二级缓存的mapper.xml文件中加入以下配置即可开启。

<!-- 开启单个mapper的二级缓存,也叫全局缓存-->
  <cache />

注意一定要加到xxMapper.xml的文件内,千万不要加到mybatis 的主配置文件里面了,会报错的。
在这里插入图片描述

第二种配置方式

所有的mapper都开启二级缓存,在mybatis.xml主配置文件中加入以下配置即可

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

在这里插入图片描述
示例代码:

public static void main(String[] args) throws IOException {
 
        // 加载mybatis配置文件
        Reader reader = Resources.getResourceAsReader("config/configuration.xml");
        //创建数据工厂
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
 
        SqlSessionFactory sqlSessionFactory = builder.build(reader);
 
        // 第一个会话
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
 
 
        // 获取会话一的mapper接口对象
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
 
        // 第一次查询
        User user = mapper.selectByPrimaryKey("3rfrf34r34");
        
        //释放第一个会话
        sqlSession.clearCache();
        sqlSession.close();
        // 第二个会话
        SqlSession sqlSession2 = sqlSessionFactory.openSession(true);
        // 获取会话二的mapper接口对象
        UserMapper mapper2 = sqlSession2.getMapper(UserMapper.class);
        // 第二次查询
        User user1 = mapper2.selectByPrimaryKey("3rfrf34r34");
        // 释放第二个会话
        sqlSession2.clearCache();
        sqlSession2.close();
    }

打印结果:
在这里插入图片描述
打印结果很明显,2次查询,但是日志显示只查询了一次数据库, 第二次是从缓存中获取的数据,至此,二级缓存已开启!

SpringBoot+Mybatis 一级缓存和二级缓存详解 本文主要介绍在 SpringBoot 项目中如何使用 Mybatis 的一级、二级缓存, 为了演示方便,本文的数据库采用 H2 内存数据库,数据库连接池默认使用 SpringBoot2.X 自带的 hikariCP。 正确的使用 Mybatis 缓存可以有效减少多余的数据库查询操作,节约 IO。 接下来我们从实践出发,看一看 mybatis 的一级,二级缓存如何使用,相关代码请查阅:https://github.com/zhengxl5566/springboot-demo.git 1、概念介绍 什么. 阅读详情

相关推荐

多模态数据集对比:MicroLens、PixelRec和Amazon在电商推荐中的表现差异

本文深入对比了三大主流多模态数据集MicroLens、PixelRec和Amazon在电商推荐中的表现差异。通过实际测试数据,分析了这些数据集在冷启动处理、模态融合、稀疏性挑战等关键场景下的真实表现,为算法工程师和研究员提供实用指南。特别关注多模态数据集的选择对推荐系统效果的影响,帮助开发者优化模型性能。

weixin_28717939的博客 417

Mybatis的一级缓存和二级缓存

验证mybatis缓存的存在,以及一级缓存如何保证数据一致性

hjkl761的博客 1万+

APM无人船测绘实战:从RTK、测深仪到图传的完整系统集成指南

本文提供了一套完整的APM无人船测绘系统集成实战指南。从RTK模块配置、测深仪数据同步到图传系统接入,详细解析了硬件选型、接线、软件参数调试及QGC地面站任务规划的全流程,旨在帮助用户将分散的部件整合为可自主执行水下地形测绘的可靠工具。

rr23456的博客 520

MyBatis一级缓存和二级缓存

根据缓存存放位置,缓存可以分为本地缓存和分布式缓存。根据缓存作用范围,缓存可以分为永久缓存和临时缓存。在 MyBatis 中,根据作用范围,分别有一级缓存和二级缓存两种类型。

weixin_58724261的博客 1万+

不只是抓取:用五指灵巧手(ROH-A001/RH56)玩转ROS2下的力控与混合控制

本文深入探讨了在ROS2环境下使用五指灵巧手(ROH-A001/RH56)实现力控与混合控制的实战技巧。从硬件通信协议解析到ROS2节点开发,详细介绍了力感知架构、实时数据处理和混合控制策略,帮助开发者在Ubuntu系统中高效实现精密操作。通过鸡蛋抓取等实例,展示了力控技术在机器人灵巧操作中的关键作用。

weixin_28221501的博客 285

IP路由原理、静态路由及动态路由区分

什么是路由 路由是指导IP报文发送的路径信息。 直连路由:目的地所在网络与路由器直接相连。 间接路由:目的地所在网络与路由器非直接相连。 静态路由是由管理员手工配置而生成的路由。 动态路由路由器使用路由协议从其他路由器那里获悉的路由。

weixin_42227328的博客 5468

mybatis中的缓存(一级缓存、二级缓存)

在计算机的世界中,缓存无处不在,重要性不言而喻。作为一款优秀的ORM框架,MyBatis中又岂能少得了缓存,本博客基于mybatis 3.5.11版本,全面介绍mybatis一级缓存、二级缓存以及自定义缓存的使用方法、实现原理、应用场景、优缺点等,并进行验证,带你彻底掌握MyBatis缓存。

m0_62943934的博客 1万+

船舶轨迹预测中的5个常见坑:基于LSTM单步预测的避坑实践

本文针对船舶轨迹预测中LSTM单步预测的常见问题,系统总结了五个典型陷阱及避坑实践。重点分析了如何正确处理AIS数据的非均匀采样与清洗、对航向角进行周期性编码、采用轨迹级归一化策略、缓解单步滚动预测的误差累积,并设计贴合业务的评估指标。这些实践能有效提升预测模型的准确性与实用性。

cnn8visionary的博客 631

一文搞懂MyBatis的一级缓存和二级缓存

在本篇文章中,将结合示例与源码,对MyBatis中的一级缓存和二级缓存进行说明。MyBatis3.5.6关于MyBatis的一级缓存,总结如下。MyBatis的一级缓存默认开启,且默认作用范围为SESSION,即一级缓存在一个会话中生效,也可以通过配置将作用范围设置为STATEMENT,让一级缓存仅针对当前执行的SQL语句生效;在同一个会话中,执行增删改操作会使本会话中的一级缓存失效;不同会话持有不同的一级缓存,本会话内的操作不会影响其它会话内的一级缓存。关于MyBatis的二级缓存,总结如下。

2301_76607156的博客 2915

基于YOLOv11的建筑图纸物体检测系统设计与实现

包含多种建筑平面图,标注了墙体、门窗等元素:CAD格式的建筑图纸数据集:专门针对建筑元素的标注数据集自定义数据集:使用LabelImg等工具自行标注的建筑图纸本文以FloorPlanDataset为基础,结合部分自定义标注数据构建混合数据集。wall (墙体)door (门)window (窗)stair (楼梯)furniture (家具)text (文字标注)dimension (尺寸标注)column (柱子)

YOLO 536

【YoloV11改进策略】基于流形约束超连接(mHC)增强YoloV11全局特征提取能力|独家复现|梁文峰署名论文

论文标题:流形约束超连接 (Manifold-Constrained Hyper-Connections, mHC)核心问题:针对超连接 (Hyper-Connections, HC) 扩展残差流宽度时破坏恒等映射、引发训练不稳定性和高内存开销的问题,提出一种约束性框架。目标:恢复残差连接的稳定性与可扩展性,同时保持HC的性能增益。基准模型:基于DeepSeek-V3的MoE架构,进行了3B、9B、27B模型的实验验证。论文图示mHC 是一个通用的HC扩展框架。

m0_47867638的博客 1345

MyBatis一级缓存和二级缓存全面详解

一级缓存的内容不能跨sqlsession。由MyBatis自动维护。,缓存范围比一级缓存更大。不同的sqlsession可以访问二级缓存的内容。哪些数据放入二级缓存需要自己指定。

2401_87299389的博客 2940

QT入门开发一个时钟

本文讲述了时钟开发的具体过程以及代码。 涉及到一下几个知识点: 1. 定时器使用 2. 本地时间获取 3. resource资源读取 4. 图片绘制 5. 图片按照中心旋转 6. sin或者cos角度计算。

啊渊的专栏 5143

mybatis缓存详解,一级缓存和二级缓存举例讲解

mybatis缓存详解,一级缓存和二级缓存举例讲解

相关项目可以查看https://gitee.com/fan-pl或https://github.com/fpl1116 2276

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

MyBatis——关于一级缓存 & 二级缓存的案例详解

MyBatis——关于一级缓存 & 二级缓存的案例详解

贝尔摩德苦艾酒 8127

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Mybatis一级缓存和二级缓存原理区别(图文详解)

Java面试经常问到Mybatis一级缓存和二级缓存,今天就给大家重点详解Mybatis一级缓存和二级缓存原理与区别@mikechen

mikechen的互联网架构 1万+

mybatis一级缓存和二级缓存使用详解

针对mybatis一级缓存和二级缓存使用进行详细说明,搞清楚mybatis缓存的生命周期。

弹指天下 7014

mybatis的一级二级缓存详解及源码解剖

一级缓存是指在同一个SqlSession中,对于相同的查询语句和参数,第一次查询的结果会被缓存到内存中,后续的查询会直接从缓存中获取结果,而不会再次查询数据库。一级缓存是MyBatis默认开启的,可以通过在SqlSession中调用clearCache()方法来清空缓存。二级缓存是指在多个SqlSession中,对于相同的查询语句和参数,第一次查询的结果会被缓存到内存中,后续的查询会直接从缓存中获取结果,而不会再次查询数据库。二级缓存是需要手动开启的,可以通过在Mapper.xml文件中添加标签来开启。

qq_48157004的博客 3004

MyBatis缓存机制:一级与二级缓存详解

一级缓存与二级缓存的原理与实战 MyBatis提供两级缓存优化查询性能:一级缓存为SqlSession级别,默认开启,仅在单次会话内有效;二级缓存为Mapper级别,需手动配置,支持跨会话共享。一级缓存通过LocalCache实现,写操作会自动清空;二级缓存要求实体类序列化,通过Cache接口实现,写操作会清空当前Mapper缓存。本文详细分析了两级缓存的工作原理、配置方法、使用场景及优化技巧,包括缓存失效场景、序列化要求、分布式缓存集成方案等,帮助开发者合理运用缓存提升系统

2401_83675559的博客 1360

【MyBatis】一级缓存 二级缓存详解

学mybatis缓存,看这篇文章就够了~

Le vent se lève, il faut tenter de vivre 1506

Mybatis一级缓存和二级缓存原理区别(图文详解)_mybatis二级缓存

MyBatis 提供了对缓存的支持,分为一级缓存和二级缓存,如下图所示:我们先大致了解下MyBatis一级缓存与MyBatis 二级缓存:一级缓存:SqlSession级别的缓存,缓存的数据只在SqlSession内有效。二级缓存:mapper级别的缓存,同一个namespace公用这一个缓存,所以对SqlSession是共享的,二级缓存需要我们手动开启。

2401_87360968的博客 1702

MyBatis一级缓存和二级缓存详解

在Java持久层框架中,MyBatis因其灵活性和易用性而备受开发者青睐。作为一款优秀的ORM框架,MyBatis不仅提供了强大的SQL映射功能,还内置了完善的缓存机制,以提高应用程序的性能和响应速度。本文将深入探讨MyBatis的一级缓存和二级缓存,从原理、配置到实际应用场景,帮助开发者更好地理解和使用MyBatis缓存,优化应用性能。缓存是提高系统性能的重要手段,通过减少数据库访问次数,可以显著降低系统响应时间,提高并发处理能力。

weixin_56018532的博客 1257

MyBatis缓存详解(一级缓存、二级缓存、缓存查询顺序)

MyBatis缓存详解(一级缓存、二级缓存、缓存查询顺序)

后端小白个人学习记录 1616

Mybatis 的一级缓存和二级缓存详解

注:本笔记是根据尚硅谷的MyBatis视频记录的 对于任何一个持久层框架,都有缓存机制;缓存在电脑中有一块真实的存储空间(https://baike.baidu.com/item/%E7%BC%93%E5%AD%98/100710?fr=aladdin); 两个关于mybatis缓存额外的链接: 关于Mybatis的一级缓存和二级缓存执行顺序具体可参考:Mybatis的一级缓存和二级缓存执行顺序  Mybatis整合第三方缓存步骤具体可参考:Myb......

猿小许的博客 5285
上一篇: MyBatis源码分析工作原理
下一篇: SpringCloud - Nacos详解
程序员老石
博客等级 码龄8年 286粉丝 162原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值