Mybaits的一二级缓存

Mybatis缓存机制(一级缓存、二级缓存、三级缓存) Mybatis 一级缓存、二级缓存、三级缓存 阅读详情

目录

一、什么是缓存

        缓存的特点:

        缓存的术语:

        缓存的适用性:

二、什么是mybatis缓存

        1.一级缓存

                1.1 一级缓存的配置

                1.2 一级缓存的工作流程

                1.3一级缓存的实现示例

                 1.4 一级缓存失效的情况

        2.二级缓存

                2.1 二级缓存的配置

                2.2 二级缓存的工作流程

                2.3 二级缓存总结

三、总结

        一级缓存和二级缓存的区别:


一、什么是缓存

        缓存(cache),即数据交换的缓冲区,当应用程序需要读取数据时,先从数据库中将数据取出,放置在缓冲区中,应用程序从缓冲区中读取数据。

        缓存的特点:

  • 缓存的优点:缓存可以让从数据库中取出的数据存在内存当中,需要数据的时候直接在内存中去读取,更加快速便捷。
  • 缓存的弊端:虽然读取数据的时候是直接在内存当中去拿比较快速,但是这样拿到的数据依旧是原来的旧数据,很可能读到的不是最新的数据。

        缓存的术语:

  • 命中:需要的数据在缓存中找到称为命中
  • 未命中:需要的数据在缓存中并未找到,需要重新获取,称为未命中

        缓存的适用性:

  • 适合使用缓存:
    • 经常查询并且不经常改变的
    • 数据的正确性对最终结果影响不大的

        比如一个公司的介绍,新闻等

  • 不适合使用缓存:
    • 经常改变的数据
    • 数据的正确性对最终结果影响很大的

        比如商品的库存,故事的牌价等

二、什么是mybatis缓存

        mybatis包含一个非常强大的查询缓存特性,他可以非常方便的定制和配置缓存,通过缓存减少Java Application与数据库的交互次数,从而提升程序的运行效率。

  • 默认情况下一级缓存开启(sqlSession级别的缓存,也称本地缓存)
  • 二级缓存需要手动开启,映射器级别的缓存,针对不同的namespace的映射器
  • 为了提高扩展性,Mybatis定义了缓存接口Cache,我们可以通过实现Cache接口来自定义二级缓存

        1.一级缓存

                1.1 一级缓存的配置

                        Mybatis默认开启了一级缓存,一级缓存有两个级别可以设置:session级别和statement级别。默认是session级别

                       session级别:即在一个Mybatis会话中执行的所有语句都会共享这一个缓存。

                       statement级别:可以理解为缓存只对当前执行的这一个statement有效。

                       我们可以在根配置文件下去配置一级缓存:

<setting name="localCacheScope" value="session">

or

<setting name="localCacheScope" value="statement">

                1.2 一级缓存的工作流程

  • 对于某个Select Statement,根据该Statement生成key;
  • 判断在本地缓存(local cache)中,该key是否有对应的数据存在
  • 如果命中,则跳过查询数据库,拿到本地的数据,继续往下走。
  • 如果没命中,去数据库中查询数据,得到想要的结果
  • 将key和查询到的结果作为一个键值对存入本地缓存(local cache)中
  • 将查询结果返回
  • 判断缓存级别是否为Statement级别,如果是的话,清空本地缓存

                1.3一级缓存的实现示例

        此处我们在同一个statement下执行两次同样的查询,会在日志里发现第一次查询他执行了查询的sql去数据库里拿了数据,而第二次直接显示了同样的数据结果,第二次便是使用了一级缓存,在缓存中拿了数据。

 

         此处我们在上面的代码后面加一条语句进行验证,结果显示这两个对象指向同一个地址值,说明他们拿到的是同一份数据,即第二次查询结果是在缓存区中拿的。

 

                 1.4 一级缓存失效的情况

  • >>不同sqlSession对应不同的一级缓存

此处我们创建了两个不同的sqlSession去查询同样的数据,发现缓存失效了,第二次去拿数据的时候依然需要去数据库里拿数据,两次查询拿到的不是同一份结果

  • >>同一个sqlSession的查询条件不同

        当查询条件不同时,我们所拿到的结果固然也会不同,那么第二次需要的数据也就当然不会在缓存里找到啦!

  • >>同一个sqlSession两次查询期间对数据进行了改变,(即增、删、改)

        此处我们在两次查询之间做了一个数据库修改,也发现缓存失效了(此处操作可以是对任意的一条或多条数据进行,此处仅仅举例)

  • >>同一个sqlSession两次查询期间手动清空了缓存

        此处我们在两次查询之间调用了sqlSession的clearCache()方法清空了缓存,缓存自然也就没有了,第二次就要再去数据库里做查询取数据

        2.二级缓存

        一级缓存中最大的共享范围就是一个sqlSession内部,那么如果多个sqlSession之间需要共享缓存,则要使用二级缓存

                2.1 二级缓存的配置

xml配置:

  • 在mybatis根配置文件下配置
  • 在mybatis的sqlMapper文件下配置
  • 在使用操作中配置(select标签中)

注解配置:

  • 在mybatis的sqlMapper文件下配置
  • 在接口的定义上面直接使用@CacheNamespace 并将blocking设置为true,二级缓存就可以使用了

                2.2 二级缓存的工作流程

                开启二级缓存后,会使用 CachingExecutor 装饰 Executor ,进入一级缓存的查询流程前,先在CachingExecutor 进行二级缓存的查询。二级缓存开启后,同一个namespace下的所有操作语句,都影响着同一个Cache,即二级缓存被多个SqlSession共享,是一个全局的变量。当开启缓存后,数据的查询执行的流程就是

                二级缓存 >> 一级缓存 >> 数据库

                工作流程图如下:

                2.3 二级缓存总结

  • Mybatis 的二级缓存相对于一级缓存来说, 实现了缓存数据的共享,可控性也更强
  • 极大可能会出现错误数据,有设计上的缺陷,安全使用的条件比较苛刻
  • 分布式环境下,必然会出现读取到错误数据,所以不推荐使用。

三、总结

        一级缓存和二级缓存的区别:

  • 范围:一级缓存是sqlSession范围的缓存,缓存只在当前sqlSession中有效;二级缓存是namespace范围的缓存,在同一个sqlMapper映射下有效;

  • 工作流程:一级缓存是先去一级缓存区中查找数据,如果没有再去数据库中查找,找到数据后将数据存入一级缓存区;二级缓存是先去二级缓存区域找数据,没有的话再接着去一级缓存区找数据,如果再没有就去数据库里拿数据,拿到后将数据存入二级缓存区。

Mybatis Cache缓存(一)一级缓存和二级缓存 一、介绍1、mybatis缓存:二、一级缓存三、二级缓存 阅读详情

相关推荐

LTE信令流程及业务流程

eNB返回E-RAB建立响应消息,E-RAB建立列表信息中包含成功建立的承载信息,E-RAB建立失败列表消息中包含没有成功建立的承载消息。3)当下行数据达到时,网络侧先对UE进行寻呼,随后UE发起随机接入过程,并发起service request过程。用户面:S-GW向eNB发送承载建立请求,包含(IMSI, QoS, TFT, TEID, LBI等)控制面:MME向eNB发送E-RAB建立请求,包含E-RAB ID,QoS,S-GW TEID。3)在S1接口上建立S1承载,在Uu接口上建立数据无线承载。

qq_44390640的博客 4514

mybatis一级缓存和二级缓存

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

学Java,找哪吒 7万+

多重共线性问题 -- 岭回归方法

概述 本篇博客分为三大部分,线性模型、多重共线性问题和岭回归。其中,线性模型中介绍了线性模型定义和普通最小二乘法对线性模型的拟合。第二部分,借由1987-2007年的人口、消费和科技对碳排放的影响的数据来说明多重共线性问题(包括如何从定性和定量两个方面判断多重共线性问题)和多重共线性问题对普通最小二乘估计的影响。第三部分,使用岭回归对第二部分中的多重共线性问题进行拟合,并基于R2R^2R2决定系数...

楚江客的记录 1万+

一文说清楚mybatis一级缓存

mybatis一级缓存级别分为两种 1、session(sqlsession级别的) 2、statement (sql级别) 一、session级别 1、对象 @Data public class Order implements Serializable { private static final long serialVersionUID = -6742502281548892194L; private Long id; private Long amount; pri

越努力,越幸运 481

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

一级缓存是SqlSession级别缓存。 在操作数据库时需要构造 sqlSession对象,在对象中有一个(内存区域)数据结构(HashMap)用于存储缓存数据。 不同的sqlSession之间的缓存数据区域(HashMap)是互相不影响的。 一级缓存的作用域是同一个SqlSession,在同一个sqlSession中两次执行相同的sql语句,第一次执行完毕会将数据库中查询的数据写到缓存(内存),

小小默:进无止境 5923

Mybaits一二级缓存

缓存 缓存只对查询有效,将查询的数据进行保存,等到查询相同的数据时,从缓存中取出 一级缓存 1.一级缓存级别是SqlSession级别的,即通过同一个SqlSession的缓存中获取数据 2.一级查询失效:1)不同的sqlsession对象对应不同的一级缓存2)同一个sqlsession对象,但是查询条件不同3)同一个sqlsession两次查询期间执行了任何一次增删改操作4)手动清空了缓存 二级缓存 二级缓存是sqlSessionFactory级别的,通过同一个SqlSessionFactory创建的

YW博客 1137

40.MyBaits懒加载、一二级缓存、模糊查询、分页查询、动态SQL

MyBaits_Day04 第一节、作业 <!-- 对getAllCateAndGoods做实现--> <select id="getAllCateAndGoods" resultMap="cateAndGoods"> SELECT * FROM category; </select> <!-- type表示resultMap是在封装谁的对象 --> <resultMap type="category" id="cateAndGoo

wy1511861159的博客 348

mybaits延迟加载原理_MyBatis 延迟加载、一二级缓存、架构设计的面试题(常问,重点了解)...

MyBatis 的面试题整理快接近尾声了,我对着问题写了 6 个 Demo,把 MyBatis 的源码翻了几遍,收获满满。不知道你看的有没有收获?可以在文末参与讨论。Let'sgo on...1、MyBatis 的 SQL 执行日志如何开启?这是之前遗留的一个问题。在配置文件的标签上设置 logImpl 参数值(SLF4J | LOG4J | LOG4J2 | JDK_LOGGING |...

weixin_32184669的博客 189

Mybatis一二级缓存的使用和实现原理

服务端开发2019-06-02 15:36:52 概述 针对查询操作,mybatis支持通过缓存的方式来减少SQL的调用,提高查询性能。在缓存级别方面分为一级缓存和二级缓存一级缓存的粒度较小,是与某个SqlSession绑定的,只对该SqlSession的相关查询操作进行缓存,不同SqlSession实例之间相互不影响,缓存为使用本地内存实现; 二级缓存是一种全局缓存,是由所有Sql...

u011277123的博客 2850

MyBaits

一级缓存

LHR2575050945的博客 234

MyBatis一二级缓存

MyBatis一二级缓存

qq_52131667的博客 355

Mybatis中接口和对应的mapper文件不同目录的配置解决

最近在学习mybatis一二级缓存时,根据网上视频使用select查询语句操作遇到的一些问题,我是单独用mybaits(版本3.5.1)的测试时(没有和spring集成),遇到如下报错: Cause: java.lang.IllegalArgumentException: Mapped Statements collection does not contain value for 你的项目中mapper的接口方法。报错的意思是说在mapper.xml中没有找到mapper接口中的方法。 通过在网..

developerFBI的专栏 2939

Mybatis一二级缓存+#和$的区别

一、二级缓存 mybatis的查询缓存分为一级缓存和二级缓存一级缓存是SqlSession级别缓存,二级缓存是mapper级别缓存,二级缓存是多个SqlSession共享的。mybatis通过缓存机制减轻数据压力,提高数据库性能。 A.一级缓存: (1)mybatis一级缓存是SQLSession级别缓存,在操作数据库时需要构造SqlSession对象,在对象中有一个HashMap用于存...

qq_41421480的博客 809

MyBatis基础设置

【代码】MyBatis基础设置。

weixin_64916888的博客 2179

Mybatis一二级缓存实现原理与使用指南(1)

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

2401_84048445的博客 1033

mybatis第三天及整理(注解形式实现一对一,一对多)

延迟加载,一二级缓存,注解开发完善,以及用注解开发实现延迟加载,一对多,一对一,一二级缓存

最难理解的博客 249

mybaits一级和二级缓存的使用

MyBatis缓存 我们知道,频繁的数据库操作是非常耗费性能的(主要是因为对于DB而言,数据是持久化在磁盘中的,因此查询操作需要通过IO,IO操作速度相比内存操作速度慢了好几个量级),尤其是对于一些相同的查询语句,完全可以把查询结果存储起来,下次查询同样的内容的时候直接从内存中获取数据即可,这样在某些场景下可以大大提升查询效率。 MyBatis缓存分为两种: 一级缓存一级缓存

yinbucheng的博客 544

Mybaits一级缓存和二级缓存分别是什么,区别是什么?

Mybaits一级缓存和二级缓存分别是什么,区别是什么?

m0_72636465的博客 583

一级缓存和二级缓存Mybaits和操作系统中分别指什么

在操作系统和Mybaits都有一级缓存和二级缓存的概念,而它们两个的含义却大有不同,今天将他们做简单的区分。 什么是mybatis缓存(cache)? eviction:代表的是缓存回收策略,MyBatis中有四种策略 将Mybaits一级缓存和二级的不同点阐述总结共有四点。 mybaits二级缓存因为是定时清空的所以有可能读脏数据,使用的条件比较苛刻,现实应用场景已经十分少见,特别是分布式环境极大可能读取到错误的数据。可以引用redis等第三方内存库作为mybatis缓存

m0_58743727的博客 1004

超声相控阵FMC+TFM成像算法开发:基于COMSOL与MATLAB的高精度无损检测解决方案

内容概要:本文详细介绍了利用COMSOL和MATLAB开发超声相控阵全聚焦(FMC)模型和全矩阵(TFM)成像算法的方法。首先,通过COMSOL 5.6及以上版本的固体力学模块构建超声相控阵模型,利用参数化扫描功能自动化地进行多次仿真实验,优化仿真参数如频率和阵元间距的影响。接着,将COMSOL仿真得到的数据导入MATLAB,通过TFM成像算法实现数据的可视化,具体步骤包括数据预处理、时延计算、插值处理以及最终的成像展示。文中还提供了详细的代码示例和技术技巧,确保每一步骤都能高效执行。适合人群:从事无损检测、超声相控阵技术研发的专业人士,尤其是有一定COMSOL和MATLAB基础的研究人员。使用场景及目标:适用于需要高精度、高分辨率检测的应用场合,如工业检测、医疗影像等领域。主要目标是帮助研究人员掌握超声相控阵FMC和TFM成像算法的开发流程,提高检测效率和准确性。其他说明:文中强调了关键技术和常见陷阱,如时基校正、GPU加速、材料参数设置等,有助于避免常见的错误并提升算法性能。同时,提供了完整的代码片段,便于读者快速上手实践。

上一篇: 数据库基本增删改查语法和多表链接查寻的方式
下一篇: Servlet的生命周期
初见#
博客等级 码龄6年 99粉丝 · 15原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值