[由零开始] 五、深度理解MyBatis缓存机制

[由零开始] 五、深度理解MyBatis缓存机制

深度理解MyBatis缓存机制

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

在这里插入图片描述
MyBatis缓存机制大致可以这么去理解 :
在这里插入图片描述
一级缓存又叫本地缓存 是作用与sqlSession层面的
二级缓存是作用与namespace也就是mappe层面也就是说 二级缓存是可以跨sqlSession
的 多个sqlSession可以共用一个二级缓存

一级缓存(本地缓存)

一级缓存是作用与sqlSession层面下的
本质上sqlSession的数据类型也是hashMap
既然是本地缓存 本地二字就知道 就是客户端1的缓存只能客户端1来查询 并且一级缓存的释放时间就是在这次会话之后就会被释放
也就是说
在同一个会话里面,多次执行相同的SQL 语句,会直接从内存取到缓存的结果,不会再发送SQL 到数据库。但是不同的会话里面,即使执行的SQL 一模一样(通过一个Mapper 的同一个方法的相同参数调用),也不能使用到一级缓存。(一次接口请求算是同一会话)
在进行delete update insert的操作时 不管数据到底有没有变更 只要是commit之后 缓存依旧会清掉

那么一级缓存到底是如何操作的呢,我们开始翻看源码

既然我们知道一级缓存是作用于sqlSession层面下的
那么我们就可以从sqlSession开始入手
从源码中我们找到SqlSession 进入到里面
在这里插入图片描述
我们发现SqlSession中的方法有很多 仔细对比发现只有这个方法是与缓存相关的
在这里插入图片描述
我们点进去看一下
在这里插入图片描述
就是执行器中的方法 我们点进去看一看
在这里插入图片描述
我再进入clear方法看一下
在这里插入图片描述
是不是突然恍然大悟 这就是HashMap啊
在这里插入图片描述
那么我们很容易得出这个流程图
在这里插入图片描述
你觉得最有可能创建缓存的地方是哪里呢
我觉得是Executor,为什么会这么想?
因为Executor是执行器,用来执行sql请求的 所以缓存的创建很有可能就在在这里
就这样 我们发现了这个方法
在这里插入图片描述
剩下的一切都不难理解了 本质上就是hashMap key value 感兴趣的话可以自己去翻一下源码

二级缓存

二级缓存的原理和一级缓存一样, 第一次查询会将数据放入缓存中, 然后第二次查询则会直接去缓存中取 但是一级缓存是基于sqlSession的, 而二级缓存是基于mapper文件的namespace的, 也就是说多个sqlSession可以共享一个mapper中的二级缓存区域, 并且如果两个mapper的namespace相同, 即便是两个mapper, 那么这两个mapper中执行sql查询到的数据也会存在相同的二级缓存区域中
下面拿UserMapper举例:
在这里插入图片描述
这里就只讲一些二级缓存的原理
下一章我们翻看源码看一下二级缓存
以及二级缓存怎么与redis整合 为什么要与redis整合

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值