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

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

深度理解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 进入到里面
[由零开始] 五、深度理解MyBatis缓存机制
我们发现SqlSession中的方法有很多 仔细对比发现只有这个方法是与缓存相关的
[由零开始] 五、深度理解MyBatis缓存机制
我们点进去看一下
[由零开始] 五、深度理解MyBatis缓存机制
就是执行器中的方法 我们点进去看一看
[由零开始] 五、深度理解MyBatis缓存机制
我再进入clear方法看一下
[由零开始] 五、深度理解MyBatis缓存机制
是不是突然恍然大悟 这就是HashMap啊
[由零开始] 五、深度理解MyBatis缓存机制
那么我们很容易得出这个流程图
[由零开始] 五、深度理解MyBatis缓存机制
你觉得最有可能创建缓存的地方是哪里呢
我觉得是Executor,为什么会这么想?
因为Executor是执行器,用来执行sql请求的 所以缓存的创建很有可能就在在这里
就这样 我们发现了这个方法
[由零开始] 五、深度理解MyBatis缓存机制
剩下的一切都不难理解了 本质上就是hashMap key value 感兴趣的话可以自己去翻一下源码

二级缓存

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