MyBatis源码分析(一)——一级缓存和二级缓存

前言

看过无数资料,背过无数面试题,我们都知道了mybatis的一级缓存是sqlSession,二级缓存是namespace,但是mybatis对于缓存到底是怎么实现的,怎么处理的呢,我想不少人其实都是一头雾水。今天,就让我们一起来看看,这背后的原理。

 

一、核心类图

二、代码实现:

 第一步:

第二步:看看执行器获取逻辑

 第三步:分析执行器simpleExcutor

SimpleExcutor的query方法来自于父类BaseExcutor

那么这里的localCache到底是什么呢?

那么为啥说一级缓存是sqlSession,而且它和线程绑定?

首先,我们sqlSession持有一个Excutor对象,而excutor对象持有一个PerpetualCache对象,也就是我们的实际存储对象。然后再看看Excutor在提交后会做什么?

对的,清空缓存,那么一旦我们的事务提交,缓存立即清空,也就是说它和当前用户请求线程绑定

第四步:分析执行器cacheExcutor

再看看这个cache哪里来的,我一路追踪,发现其最终实现在MapperBuilderAssistant类的useCacheRef和useNewCache方法

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值