mybatis -- 一级缓存详解

一级缓存的命中场景

一级缓存名字场景

运行时参数相关

  • 同一个会话 : 同一个sqlSession对象调用
  • sql语句相同, 参数相同
  • 相同的statementID : 选中的蓝色框
    在这里插入图片描述
  • 相同的分页参数

操作与配置相关

  • 未手动清空缓存
  • 未配置flushCache = true
  • 未执行update操作
  • 缓存作用域不是STATEMENT

一级缓存查询流程

在这里插入图片描述

mybatis结合spring导致一级缓存失效

失效的主要原因就是 : 在不开启事务的情况下, 通过mapper每次查询都会重新生成一个sqlSession对象, 不满足同一个会话

实例

在这里插入图片描述
可以看出, 两次查询出来的对象不相同, 因此没有走一级缓存

源码分析

spring 与 mybatis结合每次查询执行的流程如下 :
执行流程

分析

在这里插入图片描述
进入45行
在这里插入图片描述
首先就进入MapperProxy的代理类中, 执行invoke()方法
进入85行的invoke()方法
最后进入MapperMethod类的execute()方法
在这里插入图片描述
进入到87行
在这里插入图片描述
此时已经进入到SqlSessionTemplate类中, 同时160行的sqlSessionProxy对象还是代理对象, 进入160行之后, 会进入到sqlSessionProxy对象实现的InvocationHandler的invoke方法中
在这里插入图片描述
424行获取对应sqlSession对象, 让我们看一下如何获取, 进入424行
在这里插入图片描述
97行的holder对象是ThreadLocal类型的, 如果在同一个事务中99行获得的session不会是null, 会重用同一个事务中的sqlsession对象, 如果为空则通过105行重新创建一个sqlsession对象
在这里插入图片描述
之后427行通过反射执行方法, 获取数据库中的数据

== 现在可以看出, 在不同事务下, 每次查询都会重新生成一个sqlsession对象 ==

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值