mybatis的一级缓存和二级缓存(代码片段)

好大的月亮 好大的月亮     2022-12-21     346

关键词:

一级缓存

一级缓存在mybatis中默认是开启的并且是session级别,它的作用域为一次sqlSession会话。mybatis默认是开启了一级缓存的。

一级缓存的作用域有两种:session(默认)和statment,可通过设置local-cache-scope 的值来切换,默认为session
二者的区别在于session会将缓存作用于同一个sqlSesson,而statment仅针对一次查询,所以,local-cache-scope: statment可以理解为关闭一级缓存。

平时由于使用了数据库连接池,默认每次查询完之后自动commit,这就导致两次查询使用的不是同一个sqlSessioin,根据一级缓存的原理,它将永远不会生效。
当我们开启了事务,两次查询都在同一个sqlSession中,从而让第二次查询命中了一级缓存。

3次查询,其中分页查询2sql,下面两次查询只有一行sql

二级缓存

缓存的优先级
通过mybatis发起的查询,作用顺序为:二级缓存->一级缓存->数据库 ,其中任何一个环节查到不为空的数据,都将直接返回结果
缓存失效
当在一个缓存作用域中发生了updateinsertdelete 动作后,将会触发缓存失效,下一次查询将命中数据库,从而保证不会查到脏数据。

相对于一级缓存,二级缓存的作用域更广泛,它不止局限于一个sqlSession,可以在多个sqlSession之间共享,事实上,它的作用域是namespace(就是多个sqlSession中分多次查询的时候同一个mapper同一个方法参数一样就直接走cache了)。
mybatis的二级缓存默认也是开启的,但由于他的作用域是namespace,所以还需要在mapper.xml中开启才能生效

默认情况下,mybatis打开了二级缓存,但它并未生效,因为二级缓存的作用域是namespace,所以还需要在Mapper.xml文件中配置一下才能使二级缓存生效.

配置二级缓存

二级缓存demo
可以看到在多次查询后,除了分页查询,其他的单次查询都命中了缓存

多表联查二级缓存
接下来演示多表联查的二级缓存
比如有一张user表和user_order表通过id关联
user表left join user_order表 on user.id = user_order.user_id
我们考虑这样一种情况,该联查执行两次,第二次联查前更新user_order表,如果只使用cache配置,将会查不到更新的user_order,因为两个mapper.xml的作用域不同(user只缓存了自己的,所以执行userMapper里的同一个方法相同参数的时候会认为走了缓存,但是其实left join的表已经新插了一条数据),要想合到一个作用域,就需要用到cache-ref

  1. userOrderMapper.xml
<cache></cache>
  1. userMapper.xml
<cache-ref namespace="com.zhengxl.mybatiscache.mapper.UserOrderMapper"/>

首先查询了两次user表,第二次命中二级缓存,然后更新user_order表,使缓存失效,第三次查询时命中数据库。

mybatis默认的session级别一级缓存,由于springboot中默认使用了hikariCP,所以基本没用,需要开启事务才有用。但一级缓存作用域仅限同一sqlSession内,无法感知到其他sqlSession的增删改,所以极易产生脏数据.
二级缓存可通过cache-ref让多个mapper.xml共享同一namespace,从而实现缓存共享,但多表联查时配置略微繁琐。
所以生产环境建议将一级缓存设置为statment级别(即关闭一级缓存),如果有必要,可以开启二级缓存.

如果应用是分布式部署,由于二级缓存存储在本地,必然导致查询出脏数据,所以,分布式部署的应用不建议开启。

参考了大佬的博文
https://www.cnblogs.com/zhengxl5566/p/11868656.html

mybatis一级缓存与二级缓存的区别你知道吗(代码片段)

前言Java面试经常问到Mybatis一级缓存和二级缓存,今天就给大家重点详解Mybatis一级缓存和二级缓存原理与区别。Mybatis缓存缓存就是内存中的数据,常常来自对数据库查询结果的保存,使用缓存可以避免频繁与数据库... 查看详情

mybatis一级缓存与二级缓存的区别你知道吗(代码片段)

前言Java面试经常问到Mybatis一级缓存和二级缓存,今天就给大家重点详解Mybatis一级缓存和二级缓存原理与区别。Mybatis缓存缓存就是内存中的数据,常常来自对数据库查询结果的保存,使用缓存可以避免频繁与数据库... 查看详情

mybatis的一级缓存和二级缓存(代码片段)

文章目录缓存是什么?Mybatis提供的缓存一级缓存?一级缓存什么时候过期?什么时候清空?二级缓存?什么时候存?怎么配置?第一种配置:第二种配置:二级缓存什么时候过期?什么时候... 查看详情

mybatis学习笔记:一级缓存二级缓存(代码片段)

文章目录13.1、简介13.2、MyBatis缓存13.3、一级缓存测试查看一级缓存缓存失效的情况13.4、二级缓存13.1、简介1.什么是缓存(cache)?存在内存中的临时数据将用户经常查询的数据放在缓存(内存)中,用户... 查看详情

mybatis一级缓存,mybatis二级缓存,mybatis缓存失效(代码片段)

Mybatis一级缓存,Mybatis二级缓存,Mybatis缓存失效 ================================©Copyright蕃薯耀 2021-06-24https://www.cnblogs.com/fanshuyao/ 一、SpringBoot整合Mybatis1、pom.xml引入依赖(基于SpringBoot:2.3.12.REL 查看详情

mybatis缓存机制(代码片段)

...介绍2.一级缓存和二级缓存二、一级缓存三、二级缓存3.1mybatis自带的二级缓存3.1.1代码测试二级缓存3.1.2查询结果存入二级缓存的时机3.1.3二级缓存相关配置四、整合EHCache4.1EHCache简介4.2整合操作五、缓存基本原理5.1Cache接口5.2Perpe... 查看详情

深入浅出mybatis的一级二级缓存机制(代码片段)

...及各种互联网高并发、高性能、高可用的解决方案。一、MyBatis缓存缓存就是内存中的数据,常常来自对数据库查询结果的保存。使用缓存,我们可以避免频繁与数据库进行交互,从而提高响应速度。MyBatis也提供了对... 查看详情

深入浅出mybatis的一级二级缓存机制(代码片段)

...及各种互联网高并发、高性能、高可用的解决方案。一、MyBatis缓存缓存就是内存中的数据,常常来自对数据库查询结果的保存。使用缓存,我们可以避免频繁与数据库进行交互,从而提高响应速度。MyBatis也提供了对... 查看详情

mybatis的一二级缓存,一级缓存默认开启(代码片段)

1.可以知道的是Mybatis的一级缓存SqlSession默认是开启的。2.可以自己去开启二级缓存在config.xml文件中的properties下面可以加上这个配置:<settings><!--进行懒加载--><settingname="lazyLoadingEnabled"value="false" 查看详情

mybatis(代码片段)

目录JNDIMybatis中的延迟加载使用assocation实现延迟加载使用Collection实现延迟加载Mybatis中的缓存  Mybatis中的一级缓存和二级缓存     一级缓存     二级缓存Mybatis中的注解开发1mybatis的常用注解说明2使用Mybatis注解实现基本CRUD... 查看详情

mybatis——关于一级缓存&二级缓存的案例详解(代码片段)

文章目录:1.写在前面2.关于MyBatis中的缓存3.一级缓存案例详解3.1首先写一个实体Bean3.2dao接口、对应的mapper映射文件3.3mybatis配置文件、工具类3.4测试方法3.4.1同一个会话对象查询同一个数据3.4.2同一个会话对象查询两个不同的... 查看详情

十mybatis缓存系统解析(代码片段)

本文从以下几个方面介绍:1、如何开启Mybatis的缓存2、缓存的核心接口以及底层实现3、一级缓存的实现过程4、二级缓存的实现过程5、缓存的装饰器前言为了提高查询速度,减少数据库压力;Mybatis提供了缓存功能ÿ... 查看详情

mybatis一级缓存和二级缓存

MyBatis中的缓存一级缓存:  Mybatis一级缓存的作用域是同一个SqlSession,在同一个sqlSession中执行两次相同的SQL语句,第一次执行完毕后会将数据库中查询的数据写到缓存(内存),第二次会从缓存中获取数据不再从数据库中查询... 查看详情

mybatis——一级缓存二级缓存

一、Mybatis缓存●MyBatis包含一个非常强大的查询緩存特性,它可以非常方便地定制和配置缓存。绶存可以极大的提升查询效率。●MyBatis系统中默认定义了两级缓存:一级缓存和二级缓存  ○ 默认情况下,只有一级缓存开启... 查看详情

mybatis一二级缓存的源码研究(代码片段)

Mybatis的一级缓存Mybatis对缓存提供支持,但是在没有配置的默认情况下,它只开启一级缓存,一级缓存只是相对于同一个SqlSession而言。所以在参数和SQL完全一样的情况下,我们使用同一个SqlSession对象调用一个Mapper... 查看详情

mybatis的一级缓存和二级缓存

一级缓存是SqlSession级别的缓存,当使用了clearCache方法和,或者close方法的话,这个缓存失效,如果还有同样的查询,则还会发送一次查询SqlSessionsession=SqlSessionFactoryUtil.getSession();Empemp=session.selectOne("queryEmpByNo",7900);System.out... 查看详情

mybatis(代码片段)

二级缓存为什么有了一级缓存后,还需要有二级缓存呢?二级缓存是应用级缓存,也使得它具有更多的存储方式(redis,内存),而一级缓存只能在内存中存储数据。并且二级缓存存储的是应用整个生... 查看详情

mybatis-一级缓存与二级缓存

 1.1  什么是查询缓存mybatis提供查询缓存,用于减轻数据压力,提高数据库性能。mybaits提供一级缓存,和二级缓存。 一级缓存是SqlSession级别的缓存。在操作数据库时需要构造sqlSession对象,在对象中有一个(内存区... 查看详情