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

分手后的思念是犯贱 2023-06-18 03:52 93阅读 0赞

前言

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

一、核心类图

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM1ODEzNjUz_size_16_color_FFFFFF_t_70

二、代码实现:

第一步:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM1ODEzNjUz_size_16_color_FFFFFF_t_70 1

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

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM1ODEzNjUz_size_16_color_FFFFFF_t_70 2

第三步:分析执行器simpleExcutor

SimpleExcutor的query方法来自于父类BaseExcutor

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM1ODEzNjUz_size_16_color_FFFFFF_t_70 3

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

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM1ODEzNjUz_size_16_color_FFFFFF_t_70 4

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM1ODEzNjUz_size_16_color_FFFFFF_t_70 5

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

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

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM1ODEzNjUz_size_16_color_FFFFFF_t_70 6

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

第四步:分析执行器cacheExcutor

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM1ODEzNjUz_size_16_color_FFFFFF_t_70 7

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

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM1ODEzNjUz_size_16_color_FFFFFF_t_70 8

发表评论

表情:
评论列表 (有 0 条评论,93人围观)

还没有评论,来说两句吧...

相关阅读