Mybatis缓存

深入探究 MyBatis 缓存机制 当我们建立SqlSession时,就可以通过Mybatis进行sql查询,假如本次session查询时我们需要进行两次相同的sql查询,就需要进行进行两次的磁盘IO,为了避免这种没必要的等待,Mybatis为每一个SqlSession设置一级缓存,在同一个SqlSession中,一级缓存会将第一次查询结果缓存起来,第二次相同的查询就可以直接使用了。二级缓存是mybatis为了解决跨session缓存数据所增加的一层面向namespace级别的缓存方案,即以mapper。 阅读详情

测试结果: 一级缓存中的数据没有了,重新查数据库


3. 对SqlSession执行更新操作(update、delete、insert)时,同时不调用SqlSession.commit或SqlSession.close(),这时只会清空其自身的一级缓存,对二级缓存没有影响。 

测试:

结果:


4. 对SqlSession执行更新操作(update、delete、insert)后并执行SqlSession.commit()时,不仅清空其自身的一级缓存(执行更新操作的结果),也清空二级缓存(执行commit()的效果)。 

测试:

结果:


5. 对SqlSession执行更新操作(update、delete、insert)后并执行SqlSession.close()时(没有执行SqlSession.commit()),需分两类情况。当autoCommit为false时,只会清空其自身的一级缓存(执行更新操作的效果),对二级缓存没有影响。当autoCommit为true时,会清空二级缓存。 

测试:自动提交为false

结果:

测试:自动提交为true

1、缓存

为了减轻数据库的访问压力,mybatis提供了缓存功能,如果命中缓存将直接返回缓存中的结果实例,不再需要查询数据库

1.1一级缓存

一级缓存也叫本地缓存,它默认会启用,并且不能关闭.一级缓存存在于SqlSession的生命周期中,即它是SqlSession级别的缓存。在同一个 SqlSession中查询时,MyBatis会把执行的方法和参数通过算法生成缓存的键值,将键值和查询结果存入一个Map对象中.如果同一个SqlSession 中执行的方法和参数完全一致,那么通过算法会生成相同的键值,当Map缓存对象中己经存在该键值时,则会返回缓存中的对象。

编写SQL映射文件:

测试一级缓存: 在同一个SqlSession中进行查询操作

测试结果:仅仅创建了一个数据库连接,发送了一次SQL,缓存起到效果

1.2 二级缓存

二级缓存也叫为全局缓存,是SqlSessionFactory 映射级别的缓存,二级缓存存在于SqlSessionFactory的生命周期中,即它是SqlSessionFactory级别的缓存。在多个 SqlSession 之间共享缓存数据。

1、在 MyBatis 的全局配置文件(mybatis-config.xml)中,添加如下配置:

2、在需要进行二级缓存的 Mapper XML 文件中,添加如下配置:

这将启用该 Mapper 的二级缓存功能

3.进行缓存的对象需要实现序列化接口

4.使用二级缓存,在 Mapper 的 SQL 语句中,使用 useCache 属性来指定是否使用二级缓存。例如:

useCache="true" 表示使用二级缓存。如果查询结果已经在缓存中存在,则直接返回缓存结果,否则查询数据库并将结果存入缓存。

5.测试二级缓存,此时需要使用同一个SqlSessionFactory创建不同的SqlSession

测试结果: 缓存命中率为0.5,通过缓存获取数据

1.3查询顺序

1、先判断二级缓存是否开启,如果没开启,再判断一级缓存是否开启,如果没开启,直接查数据库

2、如果一级缓存关闭,即使二级缓存开启也没有数据,因为二级缓存的数据从一级缓存获取

3、一般不会关闭一级缓存

4、二级缓存默认不开启

5、如果二级缓存关闭,直接判断一级缓存是否有数据,如果没有就查数据库

6、如果二级缓存开启,先判断二级缓存有没有数据,如果有就直接返回;如果没有,就查询一级缓存,如果有就返回,没有就查询数据库;

测试数据1:

测试结果1:

测试数据2:

测试结果2:

两次打印中,第二次还去查了二级缓存;说明当二级缓存开启的情况下,即使是一个sqlSession中的缓存,都会先去查一下二级缓存,再返回查一级缓存; 所以说,缓存执行顺序是:二级缓存-->一级缓存-->数据库

1.4缓存总结[close方法和commit方法对缓存的影响]

1. 进行select操作后,调用SqlSession.close()方法,会将其一级缓存的数据放进二级缓存中,此时一级缓存随着SqlSession的关闭也就不存在了。 

2. 进行select操作后,调用SqlSession.commit()方法,会将其一级缓存的数据放进二级缓存中,并清空一级缓存。 

测试:关闭二级缓存

测试结果: 一级缓存中的数据没有了,重新查数据库


3. 对SqlSession执行更新操作(update、delete、insert)时,同时不调用SqlSession.commit或SqlSession.close(),这时只会清空其自身的一级缓存,对二级缓存没有影响。 

测试:

结果:


4. 对SqlSession执行更新操作(update、delete、insert)后并执行SqlSession.commit()时,不仅清空其自身的一级缓存(执行更新操作的结果),也清空二级缓存(执行commit()的效果)。 

测试:

结果:


5. 对SqlSession执行更新操作(update、delete、insert)后并执行SqlSession.close()时(没有执行SqlSession.commit()),需分两类情况。当autoCommit为false时,只会清空其自身的一级缓存(执行更新操作的效果),对二级缓存没有影响。当autoCommit为true时,会清空二级缓存。 

测试:自动提交为false

结果:

测试:自动提交为true

1.5回收策略

MyBatis 包含一个非常强大的查询缓存特性,它可以非常方便地配置和定制。MyBatis 3 中的缓存实现的很多改进都已经实现了,使得它更加强大而且易于配置。

默认情况下是没有开启缓存的,除了局部的 session 缓存,可以增强变现而且处理循环 依赖也是必须的。要开启二级缓存,你需要在你的 SQL 映射文件中添加一行: <cache/>字面上看就是这样。这个简单语句的效果如下: 

映射语句文件中的所有 select 语句将会被缓存。 

映射语句文件中的所有 insert,update 和 delete 语句会刷新缓存。

缓存会使用 Least Recently Used(LRU,最近最少使用的)算法来收回。 

根据时间表(比如 no Flush Interval,没有刷新间隔),缓存不会以任何时间顺序 来刷新。 

缓存会存储列表集合或对象(无论查询方法返回什么)的 1024 个引用。 

缓存会被视为是 read/write(可读/可写)的缓存,意味着对象检索不是共享的,而且可以安全地被调用者修改,而不干扰其他调用者或线程所做的潜在修改。

所有的这些属性都可以通过缓存元素的属性来修改。

比如:这个更高级的配置创建了一个 FIFO 缓存,并每隔 60 秒刷新,存数结果对象或列表的 512 个引用,而且返回的对象被认为是只读的,因此在不同线程中的调用者之间修改它们会导致冲突。

可用的收回策略有:

LRU – 最近最少使用的:移除最长时间不被使用的对象。 

FIFO – 先进先出:按对象进入缓存的顺序来移除它们。 

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

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

flushInterval(刷新间隔)可以被设置为任意的正整数,而且它们代表一个合理的毫秒形式的时间段。默认情况是不设置,也就是没有刷新间隔,缓存仅仅调用语句时刷新。

size(引用数目)可以被设置为任意正整数,要记住你缓存的对象数目和你运行环境的可用内存资源数目。默认值是 1024。

readOnly(只读)属性可以被设置为 true 或 false。只读的缓存会给所有调用者返回缓存对象的相同实例。因此这些对象不能被修改。这提供了很重要的性能优势。可读写的缓存会返回缓存对象的拷贝(通过序列化)。这会慢一些,但是安全,因此默认是 false。

MyBatis 缓存原理解析 为什么 MyBatis 要缓存 缓存在互联网系统中是非常重要的, 其主要作用是将数据保存到内存中, 当用户查询数据时, 优先从缓存容器中获取数据,而不是频繁地从数据库中查询数据,从而提高查询性能。而在 ORM 框架中引入缓存的目的就是为了减少读取数据库的次数,从而提升查询的效率。 在 MyBatis 中存在两种缓存,一个在事务内部使用的一级缓存,另一个可以全局使用的二级缓存。 一级缓存 一级缓存也叫本地缓存,在MyBatis中,一级缓存是在会话(SqlSession)层面实现的,这就说明一级缓存作用范围只 阅读详情

相关推荐

mybatis的一级缓存和二级缓存

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

学Java,找哪吒 7万+

MyBatis中的缓存

MyBatis的缓存一、概述二、一级缓存1. 一级缓存(本地缓存)2. 作用3. 一级缓存失效的情况(没有使用到当前一级缓存的情况,效果就是还要再向数据库发出查询)三、二级缓存1. 二级缓存(全局缓存)2. 工作机制3. 使用四、缓存的相关配置 一、概述 基本概念:MyBatis包含一个非常强大的查询缓存特性,它可以非常方便地配置和定制。缓存可以极大的提升查询效率。 分类MyBatis系统中默认定义了两级缓存,分别是一级缓存和二级缓存。 基本介绍:① 默认情况下,只有一级缓存(SqlSession级别的

weixin_44446626的博客 9277

时间同步中 TOD 与GPRMC和IRIG-B的区别

时间同步中 TOD 与GPRMC和IRIG-B的区别

ftdlk的博客 1725

【MyBatis】| MyBatis的缓存

【MyBatis】| MyBatis的缓存

m0_61933976的博客 5030

ESP32脑机接口开发板:EEG信号采集与应用开发指南

脑机接口(BCI)技术通过采集脑电图(EEG)信号实现人机交互,其核心在于高精度生物电信号采集与实时处理。基于ESP32微控制器的开发平台结合专业级ADS1299 ADC芯片,可构建8通道EEG信号采集系统,支持250SPS采样率与可编程增益。这种嵌入式解决方案在科研教育领域具有显著优势,既能满足信号质量要求,又大幅降低开发门槛。典型应用包括实时脑电波可视化、注意力检测等BCI场景,通过Python生态工具链(如BrainFlow、LSL)可快速实现数据处理。开发时需注意电极阻抗控制(<10kΩ)和50/6

weixin_42518874的博客 343

Camera metadata

Camera metadata

weixin_42136255的博客 2528

MyBatis——MyBatis的缓存

MyBatis的缓存

wan的博客 2374

安装破解IAR EWARM 8.2,提供注册机

IAR Embedded Workbench for ARM(IAR for ARM)是一款微处理器的集成开发环境软件,该集成开发环境中包含了IAR的C/C++编译器、 汇编工具、链接器、库管理器、文本编辑器、工程管理器和C-SPY调试器,支持ARM,AVR,MSP430等芯片。   一、安装 双击运行安装程序,点击Install IAR Embedded Workbench for ARM...

睿思派克 4万+

MYBATIS缓存

MYBATIS的第一缓存是SQLSession 并且这种缓存是即使在仅仅只有一个框架的情况下都是存在的, 因为第一缓存是默认开启的(default), 因为第一缓存级别使用的是SqlSession, 所以在调用同一个SqlSession, 并且在这同一个SqlSession当中多次查询同一个数据, 那么仅仅只会执行一次相应的SQL语句, 之后会直接从SQL缓存当中进行获取以我的测试类为例@Test结果如图所示, 跟我们预想的一样, 在第一级别的缓存下, 仅仅调用了一次相应的查询语句。

2303_79546217的博客 1431

AirSim安装和地图加载

详细教程如何安装AirSim并加载地图

fegxg的博客 3033

从Peer到脉冲地震波:免费Python工具全流程配置教程(PyCharm+Anaconda)

本文详细介绍了如何使用Python工具链(PyCharm+Anaconda)实现从Peer数据库获取地震波数据到生成脉冲地震波的全流程配置。通过开源工具EQTOOL和PySeismicGen,结合Python环境搭建、数据格式转换和脉冲地震动生成技术,为结构抗震分析提供高效、灵活的解决方案。

weixin_29093169的博客 430

【MyBatis】MyBatis的缓存

因此这些对象不能被修改。查询的数据会被缓存,下次查询相同的数据,就 会从缓存中直接获取,不会从数据库重新访问。先查询二级缓存,因为二级缓存中可能会有其他程序已经查出来的数据,可以拿来直接使用。查询的结果会被 缓存;此后若再次执行相同的查询语句,结果就会从缓存中获取。两次查询之间执行了任意的增删改,会使一级和二级缓存同时失效。查询的数据所转换的实体类类型必须实现序列化的接口。最近最少使用的:移除最长时间不被使用的对象。不同的SqlSession对应不同的一级缓存。关闭之后,一级缓存中的数据会写入二级缓存。

Javascript_tsj的博客 1455

11n、11ac、11ax和11be MCS表(全网最全)

1、无线协商速率介绍及计算 2、附11n、11ac、11ax 完整MCS速率表

weixin_41500064的博客 2万+

【mybatis】缓存

比如要对数据库进行查询:select * from A因为真正执行的是sqlsession,用sqlsession对他进行查询,查询到的数据会缓存到local catch本地缓存中,下一次再查询,就不用查询数据库了,直接从本地缓存中拿取。$1. 首次进行:@Test@Test结果:执行两次查询,但是sql语句只执行一次。为什么?因为第二次查询从本地缓存查数据。@Test注!!值是true, 表明指向的是同一个地址空间,指向的是同一个对象。

m0_75163045的博客 1956

ESM2蛋白预训练模型 蛋白质、氨基酸向量表示

参考: https://github.com/facebookresearch/esm https://huggingface.co/facebook/esm2_t33_650M_UR50D https://esmatlas.com/resources?action=fold tokenizer_对输入蛋白会头尾添加cls、eos特殊字符,占两个字符长度 参考:https://github.com/facebookresearch/esm 直接clone下来代码

weixin_42357472的博客 1万+

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Mybatis——MyBatis 缓存

MyBatis缓存

秋玄的博客 1653

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Mybatis之缓存

一、MyBatis的一级缓存二、MyBatis的二级缓存三、二级缓存的相关配置四、MyBatis缓存查询的顺序五、整合第三方缓存EHCache1、添加依赖2、各个jar包的功能3、创建EHCache的配置文件ehcache.xml4、设置二级缓存的类型5、加入logback日志6、EHCache配置文件说明以上就是Mybatis之缓存的相关知识点,希望对你有所帮助。积跬步以至千里,积怠惰以至深渊。时代在这跟着你一起努力哦!

哥的时代,为你保驾护航 2030

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

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

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

MyBatis 的缓存机制

MyBatis 缓存包括:一级缓存:将查询到的数据存储到 SqlSession 中二级缓存:将查询到的数据存储到 SqlSessionFactory 中或者是集成其它第三方的缓存:比如 EhCache(Java语言开发的),Memcache(C语言开发的)等。注意:缓存只针对于 DQL(查询)语句,也就是说缓存机制只对应 Select 语句。一级缓存默认是开启的一级缓存失效情况包括两种:第一种:第一次查询和第二次查询之间,手动清空了一级缓存。

weixin_61635597的博客 2030

MyBatis之缓存

在当今的 Web 应用程序中,性能是至关重要的。缓存是提高应用程序性能的一种常用技术,它可以减少数据库查询的次数,从而提高应用程序的响应时间。MyBatis 是一个流行的 Java ORM(对象关系映射)框架,它提供了强大的缓存功能,可以帮助开发者提高应用程序的性能。在本博客中,我们将介绍 MyBatis 缓存的基本概念和工作原理,以及如何在 MyBatis 中配置和使用缓存。我们还将介绍一些常见的缓存策略和缓存过期机制,以帮助开发者更好地管理缓存。

liubopro666的博客 2297

MyBatis缓存

什么是缓存?缓存:存储在计算机上的一个原始数据复制集,就是数据交换的缓冲区(称作Cache),是存贮数据(使用频繁的数据)的临时地方。当用户查询数据,首先在缓存中寻找,如果找到了则直接执行。如果找不到,则去数据库中查找。缓存有什么用?缓存的本质就是用空间换时间,牺牲数据的实时性,以服务器内存中的数据暂时代替从数据库读取最新的数据,减少数据库IO,减轻服务器压力,减少网络延迟,加快页面打开速度。缓存的分类文件缓存:文件缓存是把一些需要高速存取的变量缓存在内存中。

热爱编程、热爱生活、热爱探索 2218

MyBatis的缓存

为什么使用缓存?首次访问时,查询数据库,并将数据存储到内存中;再次访问时直接访问缓存,减少IO、硬盘读写次数、提高效率Mybatis中的一级缓存和二级缓存?一级缓存:它指的是mybatis中的SqlSession对象的缓存。当我们执行完查询之后,查询的结果会同时存在在SqlSession为我们提供的一块区域中。当我们再次查询同样的数据,mybatis会先去SqlSession中查询是否有,有的话直接拿出来使用。当SqlSession对象消失时,Mybatis的一级缓存也就消失了。

qq_63242968的博客 1236

MyBatis 缓存——Mybatis 一级缓存、Mybatis 二级缓存

像大多数的持久化框架一样,Mybatis 也提供了缓存策略,通过缓存策略来减少数据库的查询次数,从而提高性能 Mybatis 中缓存分为一级缓存,二级缓存 Mybatis 一级缓存 Mybatis 二级缓存 ...

Lemon 1867
上一篇: Spring中常用的注解
下一篇: Mybatis动态SQL
Moon_Drop_LAN
博客等级 码龄3年 34粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值