Mybatis一级缓存与二级缓存的区别你知道吗
前言
Java面试经常问到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中创建了本地缓存(一级缓存),如下图所示:
大致的流程如下:
第一次查询用户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 进行二级缓存的查询,具体的工作流程如下所示。
二级缓存开启后,同一个 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的一级缓存和二级缓存机制原理和区别
程序中为什么使用缓存? 实际上适用于缓存的数据:经常查询并且不经常改变的,并且的数据的正确与否对最终结果影响不大的.不适用于缓存的数据:经常改变的数据,数据的正确与否对最终 结果影响很大的. Myba ...
- mybatis一级缓存和二级缓存的区别?
mybatis一级缓存和二级缓存? 一级缓存(本地缓存) 1.mybatis一级缓存是SqlSession级别的缓存, 2.在操作数据库的时候需要构造sqlsession对象,在对象中有一个数据结构( ...
- 框架源码专题:Mybatis的一级缓存、二级缓存是什么?有什么作用?
文章目录 1. Mybatis中缓存的作用 2. 一级缓存 3. 二级缓存 4. 一级缓存和二级缓存的区别 5. 通过代码观察Mybatis缓存工作的全过程 1. Mybatis中缓存的作用 首先缓存 ...
- Mybatis缓存机制(一级缓存、二级缓存、三级缓存)
一.含义: 缓存就是内存中的数据,常常来自对数据库查询结果的保存. 使用缓存,我们可以避免频繁与数据库进行交互,从而提高响应速度. Mybatis的缓存分为一级缓存.二级缓存.三级缓存. 一级缓存: ...
- mybatis一级缓存和二级缓存使用详解
文章目录 一.概念说明 1.一级缓存 2.二级缓存 3.比较 二.mybatis缓存的生命周期 三.一级缓存的使用 四.二级缓存的使用 五.自定义二级缓存 六.mybatis缓存.spring缓存和r ...
- 面试题总结(mybatis一级缓存及二级缓存、springboot自动装配原理等)
1.mybatis一级缓存及二级缓存 区别: 一级缓存的作用域是一个sqlsession内: 二级缓存作用域是针对mapper(Namespace)进行缓存: 一级缓存: 在参数和SQL完全一样的情况 ...
- Mybatis一级缓存,二级缓存的实现就是这么简单
介绍 又到了一年面试季,所以打算写一点面试常问的东西,争取说的通俗易懂.面试高级岗,如果你说熟悉Mybatis,下面这些问题基本上都会问 Mybatis插件的实现原理? 如何写一个分页插件? Myba ...
- mybatis高级(3)_延迟加载_深度延迟_一级缓存_二级缓存
设置延迟加载需要在mybatis.xml中设置 注: 侵入式延迟加载为真时是延迟加载 侵入式延迟加载为假时是深度延迟加载 <!-- 延迟加载和深度延迟加载 --><settings& ...
- MyBatis框架:延迟加载策策略、一级缓存、二级缓存
MyBatis框架:延迟加载策略和缓存 Mybatis 延迟加载策略 1.1 何为延迟加载? 1.2 实现需求 1.3 使用association实现延迟加载 1.3.1 账户的持久层DAO接口 1. ...
最新文章
- Microbiome:Kraken2进行16S物种注释又快又准
- Docker Compose安装
- exchange 2010-诊断小工具简解
- 711 发送请求失败_30秒上手新一代 Http 请求神器 RxHttp
- Windows 7 硬盘安装
- c、c++、Java和gcc写Hello World
- js将时间转换为时间戳
- linux下查看某软件是否已安装, ubuntu安装deb包
- 2021牛客暑期多校训练营4,签到题CFIJ
- PyTorch学习笔记(一):PyTorch环境安装
- paip.jdk1.4 1.5(5.0) 1.6(6.0) 7.0 8.0特点比较与不同
- 深度森林论文阅读笔记
- mess组网 中继_还在用无线路由器中继?快来看乙辰科技全新更智能的无线Mesh组网...
- HashMap遍历方法和实现原理分析
- Python 音频随机播放器脚本
- ffmpeg图片格式转换
- 和sar比起来,其他Linux命令都是猹
- 图与排列、图的存在性
- 帆软10.0突然出现黑色框线以及打印预览出现plain问题
- 微信再次改版!这个功能终于要下线
热门文章
- 【译】教你用50种语言写Hello, World
- 【Linux|CentOS】配置防火墙
- GAN|在图像生成领域里,GAN这一大家族是如何生根发芽的
- 软件工程数据流图作业
- 为个小善——发布 Python 库 absolute32
- python线程回收_python之线程
- python 线程重启_在Python中重新启动一个线程
- 2021-12-12 Leetcode 1497.检查数组对是否可以被 k 整除
- 2021-05-24Leetcode322.零钱兑换
- 跟Steve Jobs学简报[4-5](恋花蝶整理版)