[由零开始] 五、深度理解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整合