Mybatis缓存——二级缓存(1),闭关60天学懂NDK+Flutter

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新大数据全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip204888 (备注大数据)
img

正文

我们执行一下,查看运行结果
在这里插入图片描述
我们可以看到执行了两次方法,发送了一次sql,缓存命中率为0.5,也就是说有一次是走的缓存

二级缓存整合redis

Mybatis二级缓存是单机的,但是现在大多数的项目都是分布式的,所以二级缓存就起不到作用了,这里我们使用二级缓存去整合redis配置成分布式缓存
1、在pom文件中引入mybatis-redis这个包

 <dependency>
            <groupId>org.mybatis.caches</groupId>
            <artifactId>mybatis-redis</artifactId>
            <version>1.0.0-beta2</version>
 </dependency>

2、mapper.xml配置

<cache type="org.mybatis.caches.redis.RedisCache"></cache>

3、redis.properties

redis.host=localhost
redis.port=6379
redis.connectionTimeout=5000
redis.password=
redis.database=0

这样就算是完成了二级缓存对redis的整合

源码

二级缓存标签
配置文件 cacheEnabled

接下来我们通过源码,来一步步的对二级缓存进行解析
首先,我们在执行上面的二级缓存的demo之前,需要先加载解析mapper.xml配置文件

 SqlSessionFactory sqlSessionFactory;
    @Before
    public void before() throws IOException {
        InputStream resourceAsStream = Resources.getResourceAsStream("SqlConnectoin.xml");
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        sqlSessionFactory = sqlSessionFactoryBuilder.build(resourceAsStream);
    }

我们从build方法点进去,一直点一下去,我们就会看到,在XMLConfigBuilder这个类的parseConfiguration()这个方法里面有一个settings标签,这个settings就是我们在配置文件里面配置的settings标签,然后我我们点进去。
在这里插入图片描述
然后我们在这里就可以看到我们在配置文件配置的开启二级缓存标签
在这里插入图片描述
这里把这个标签值存入了configuration里面
configuration这个bean就是专门用来存储配置文件信息的bean

Mpper.xml :cache标签

既然我们找到了在配置文件中设置的二级缓存标签,那么别忘了,在mapper文件里面我们也设置了一个标签,这个标签会存储在哪里呢?
我们的mapper地址都配置在配置文件的标签下,所以我们要找到mapper标签在这里插入图片描述
中间的寻找过程这里就不写了,太多了,最后我们会发现他创建了一个不为null的cache对象,并且把cache存入了configuration里面
在这里插入图片描述
然后我们再看,他有一个buildStatementFromContext方法,就是根据不同的方法标签去构建MppedStatement对象,这个对象里面存储了我们mapper方法所有的属性
在这里插入图片描述
最后我们会在这里找到我们的答案,但是这是段特别长的代码,所以我把他拷贝了出来,从新格式一下,方便大家阅读
在这里插入图片描述
在这里插入图片描述
我们看到,他是根据我们的cache标签然后生成了一个非空的cache对象,并且在最后将这个对象赋值给了mappedStatement

查询

然后我们看查询方法,还是从Sqlsession这个类里面随便找一个查询方法开始
在这里插入图片描述
我们一路往下点可以看到,查询单条数据的方法实际上是调用的查询列表方法
在这里插入图片描述
当我们点到query查询的时候发现会有两个实现,那么我们应该去选择哪个呢?在这里插入图片描述
这里我们选择CachingExecuotor这个实现类,那么为什么呢?首先我们根据名字就可以知道这是一个缓存实现,其次呢,我们需要返回到客户端调用时候
在这里插入图片描述
我们在具体执行查询的时候,需要先通过opensession方法去创建sqlsession,那么我们同样点击进去看一下源码。
在这里插入图片描述
在openSessionFromDataSource方法里面调用了configuration的newExecutor方法创建执行器,那么答案应该就在这个方法里面
在这里插入图片描述
还记得之前我们存入configuration里面的cacheEnagled吗?这里判断这个属性来表示是否使用二级缓存,使用二级缓存就使用对应的缓存执行器来执行。
接着我们回到query查询方法,选择CachingExecutor
在这里插入图片描述
ms.getCache,我们从前面的源码已经得知,在解析配置文件的cache标签的时候,就创建了一个不为null的cache对象,并且存储到了MappedStatement里面,所以我们这里要走cache代码块里面的内容
this.flushCacheIfRequired(ms)是否需要刷新缓存
在这里插入图片描述
在这个方法里面是根据cache不为null和isFlushCacheRequired()是否为true来判断,isFlushCacheRequired()里面存储的就是我们之前配置二级缓存在方法上用flushCache标识是否刷新缓存的标签。
我们看到它里面这段代码:this.tcm.clear(cache)他清空的是TransactionalCacheManager,那么也就是说二级缓存是存放在TransactionalCacheManager的。
List list = (List)this.tcm.getObject(cache, key);也就是先从TransactionalCacheManager获取缓存,如果获取不到就执行下面的query查询,这个会跳转到BaseExecutor里面的query方法里面,这一块在《Mybatis缓存——一级缓存》里面有过介绍,其中localCache是一级缓存,那么也就是说如果二级缓存没有,就会先去找一级缓存,如果一级缓存也没有,最后才会去数据库查询。
那么我们获取二级缓存是从TransactionalCacheManager的delegate中获取的
在这里插入图片描述
然后我们往下看存的时候又是怎么存的
在这里插入图片描述
他存的时候是存在了entriesToAddOnCommit这个map对象里面的
存和去不在一个对象里面,这是为什么呢?
我们可以做一个试验,使用两个sqlsession对象,执行同样的sql方法,第一个sqlsession执行完后执行第二个sqlsession方法,这个时候我们发现第二个sqlsession没有命中二级缓存,然后我们修改一下我们的测试方法,在第一个sqlsession执行完之后,我们执行关闭或者是commit提交操作,然后再执行第二个sqlsession方法,这个时候就会命中二级缓存。结合我们的源码,这说明了我们在正常执行完方法之后会先将数据存入entriesToAddOnCommit中,而当在执行外close或者是commit方法之后才会将数据刷新进真正二级缓存的对象delegate中。

Commit

下面是CachingExecutor的commit方法在这里插入图片描述
他这里除了正常的commit提交以外,还多了一个tcm.commit(),也就是TransactionalCacheManager的commit方法

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注大数据)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

8 (备注大数据)**
[外链图片转存中…(img-y1OBvw9S-1713310663712)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值