Mybatis 一级缓存和二级缓存原理区别


Posted in Java/Android onSeptember 23, 2022

Mybatis 一级缓存和二级缓存原理区别

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

Mybatis缓存

缓存就是内存中的数据,常常来自对数据库查询结果的保存,使用缓存可以避免频繁与数据库进行交互,从而提高查询响应速度。

MyBatis 提供了对缓存的支持,分为一级缓存和二级缓存,如下图所示:

Mybatis 一级缓存和二级缓存原理区别

我们先大致了解下MyBatis一级缓存与MyBatis 二级缓存:

一级缓存:SqlSession级别的缓存,缓存的数据只在SqlSession内有效。

二级缓存:mapper级别的缓存,同一个namespace公用这一个缓存,所以对SqlSession是共享的,二级缓存需要我们手动开启。

下面我们再分别详解两者的原理与区别。

Mybatis一级缓存

1.为什么需要Mybatis一级缓存

当我们使用Mybatis进行数据库的操作时候,会创建一个SqlSession来进行一次数据库的会话,会话结束则关闭SqlSession对象。

如果我们很有可能多次查询完全相同的sql语句,每一次查询都查询一次数据库,那查询数据库代价是比较大的,这会导致系统的资源浪费。

为了解决这个问题,Mybatis对每一次会话都添加了缓存操作,不用相同的SQL每次都需要查询数据库,这就是Mybatis一级缓存的作用。

2.Mybatis一级缓存的实现

我们知道对SqlSession的操作,mybatis内部都是通过Executor来执行的,Executor的生命周期和SqlSession是一致的。

Mybatis在Executor中创建了本地缓存(一级缓存),如下图所示:

Mybatis 一级缓存和二级缓存原理区别

大致的流程如下:

第一次查询用户id信息,先去缓存中查询是否有,如果没有,从数据库中查询用户信息,得到用户信息后在将用户信息储存到一级缓存中。

如果sqlSession去执行commit操作(插入、更新、删除),清空sqlSession中的一级缓存,保证缓存中始终保存的是最新的信息,避免脏读。

第二次查询用户id信息,先去缓存中查询,如缓存中有,直接从缓存中获取。

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

在mybatis与spring进行整合开发时,事务控制在service中进行,重复调用两次servcie将不会走一级缓存,因为在第二次调用时session方法结束,SqlSession就关闭了。

3.Mybatis一级缓存配置

mybatis一级缓存的范围有SESSION和STATEMENT两种,默认是SESSION。

如果不想使用一级缓存,可以把一级缓存的范围指定为STATEMENT,这样每次执行完一个Mapper中的语句后都会将一级缓存清除。

如果需要更改一级缓存的范围,可以在Mybatis的配置文件中,在下通过localCacheScope指定。

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

Mybatis二级缓存

1.为什么需要Mybatis二级缓存?

MyBatis 一级缓存最大的共享范围就是一个SqlSession内部,那么如果多个 SqlSession 需要共享缓存,则需要开启二级缓存。

2.Mybatis二级缓存的实现

开启二级缓存后,会使用 CachingExecutor 装饰 Executor,进入一级缓存的查询流程前,先在 CachingExecutor 进行二级缓存的查询,具体的工作流程如下所示。

Mybatis 一级缓存和二级缓存原理区别

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

当开启缓存后,数据的查询执行的流程就是 二级缓存 -> 一级缓存 -> 数据库。

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

Mybatis一级缓存与二级缓存的区别

1)一级缓存 Mybatis的一级缓存是指SQLSession,一级缓存的作用域是SQlSession, Myabits默认开启一级缓存。

在同一个SqlSession中,执行相同的SQL查询时;第一次会去查询数据库,并写在缓存中,第二次会直接从缓存中取。 当执行SQL时候两次查询中间发生了增删改的操作,则SQLSession的缓存会被清空。

每次查询会先去缓存中找,如果找不到,再去数据库查询,然后把结果写到缓存中。 Mybatis的内部缓存使用一个HashMap,key为hashcode+statementId+sql语句。Value为查询出来的结果集映射成的java对象。 SqlSession执行insert、update、delete等操作commit后会清空该SQLSession缓存。

2) Mybatis二级缓存是默认不开启的,作用于一个Application,是Mapper级别的,多个SqlSession使用同一个Mapper的sql能够使用二级缓存。

到此这篇关于Mybatis 一级缓存和二级缓存原理区别 的文章就介绍到这了,更多相关Mybatis 缓存内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Java/Android 相关文章推荐
浅析NIO系列之TCP
Jun 15 Java/Android
Spring Cache和EhCache实现缓存管理方式
Jun 15 Java/Android
总结一下关于在Java8中使用stream流踩过的一些坑
Jun 24 Java/Android
Java基础之详解HashSet的使用方法
Jun 30 Java/Android
Java基础之this关键字的使用
Jun 30 Java/Android
看完这篇文章获得一些java if优化技巧
Jul 15 Java/Android
java设计模式--建造者模式详解
Jul 21 Java/Android
JAVA 线程池(池化技术)的实现原理
Apr 28 Java/Android
详解Android中的TimePickerView(时间选择器)的用法
Apr 30 Java/Android
JAVA springCloud项目搭建流程
May 11 Java/Android
Java实现字符串转为驼峰格式的方法详解
Jul 07 Java/Android
Mybatis 一级缓存和二级缓存原理区别
Sep 23 Java/Android
Java实现贪吃蛇游戏的示例代码
Sep 23 #Java/Android
Java获取字符串编码格式实现思路
Sep 23 #Java/Android
java获取一个文本文件的编码(格式)信息
Sep 23 #Java/Android
JDK8中String的intern()方法实例详细解读
Sep 23 #Java/Android
Spring boot实现上传文件到本地服务器
Aug 14 #Java/Android
Spring Boot实现文件上传下载
Aug 14 #Java/Android
Springboot集成kafka高级应用实战分享
You might like
DC《小丑》11项提名领跑奥斯卡 Netflix成第92届奥斯卡提名最大赢家
2020/04/09 欧美动漫
十天学会php之第二天
2006/10/09 PHP
Js 订制自己的AlertBox(信息提示框)
2009/01/09 Javascript
子窗口、父窗口和Silverlight之间的相互调用
2010/08/16 Javascript
基于jquery的bankInput银行卡账号格式化
2012/08/22 Javascript
jquery实现在页面加载的时自动为日期插件添加当前日期
2014/08/20 Javascript
jQuery背景插件backstretch使用指南
2015/04/21 Javascript
JS+CSS实现鼠标经过弹出一个DIV框完整实例(带缓冲动画渐变效果)
2016/03/25 Javascript
js中字符串编码函数escape()、encodeURI()、encodeURIComponent()区别详解
2016/04/01 Javascript
浅谈js和css内联外联注意事项
2016/06/30 Javascript
原生js实现倒计时功能(多种格式调用)
2017/01/12 Javascript
利用jQuery实现滑动开关按钮效果(附demo源码下载)
2017/02/07 Javascript
vue数据双向绑定的注意点
2017/06/23 Javascript
import与export在node.js中的使用详解
2017/09/28 Javascript
10行代码实现微信小程序滑动tab切换
2018/12/28 Javascript
javascript数组去重方法总结(推荐)
2019/03/20 Javascript
详解iframe跨域的几种常用方法(小结)
2019/04/29 Javascript
viewer.js一个强大的基于jQuery的图像查看插件(支持旋转、缩放)
2020/04/01 jQuery
vue a标签点击实现赋值方式
2020/09/07 Javascript
python实现根据窗口标题调用窗口的方法
2015/03/13 Python
用十张图详解TensorFlow数据读取机制(附代码)
2018/02/06 Python
单链表反转python实现代码示例
2018/02/08 Python
python打印9宫格、25宫格等奇数格 满足横竖斜相加和相等
2019/07/19 Python
OpenCV3.0+Python3.6实现特定颜色的物体追踪
2019/07/23 Python
python目标检测给图画框,bbox画到图上并保存案例
2020/03/10 Python
如何使用python socket模块实现简单的文件下载
2020/09/04 Python
python基于爬虫+django,打造个性化API接口
2021/01/21 Python
摩托车和ATV零件、配件和服装的首选在线零售商:MotoSport
2017/12/22 全球购物
简述你对Statement,PreparedStatement,CallableStatement的理解
2013/03/25 面试题
生产主管岗位职责
2013/11/10 职场文书
打架检讨书800字
2014/01/10 职场文书
大型会议接待方案
2014/03/01 职场文书
思想作风纪律整顿心得体会
2014/09/04 职场文书
社区文明倡议书
2015/04/28 职场文书
党支部审查意见
2015/06/02 职场文书
2015年学校办公室主任工作总结
2015/07/20 职场文书