Mybaits源码赏析三:深度解析Mybaits的一级缓存机制


前言

Mybaits的缓存是我们在面试中经常遇到的问题,我通宵了两天两夜彻底弄懂了mybaits缓存机制,纯手打,纯原创,希望大家收藏点赞转发一键三连,我将通过源码方面来解析Mybaits的一级缓存,让我们一起吊打面试官。


提示:以下是本篇文章正文内容,下面案例可供参考

一、深入了解一级缓存机制

一级缓存实现起来的还是比较简单的,就是单纯的利用一个PerpetualCache里面的Map进行数据的存储,这个一级缓存实现起来有一个bug,可以关注我的另一篇博客Mybaiys源码赏析一:可以优化的查询方法
废话不多说,直接上代码:在这里插入图片描述
在<<Mybaits源码赏析二:深度解析Mybaits的二级缓存机制>>一文中我们提到过,如果二级缓存没有值的话就去调用BaseExecutor.query()方法,这里也是先查一级缓存,看有没有值,没有的话再去查询数据库。
这里的localCache变量就是PerpetualCache。
在这里插入图片描述
缓存的key,通过id(方法名),offset(偏移量),limit(限制量),sql(sql语句)来进行定义的。

在这里插入图片描述
调用doQuery()方法,然后调用Statement的execute()方法执行Sql,查询出来的数据接着调用localCache.putObject(key, list)方法将结果进行缓存。

问题1:一级缓存什么时候进行更新?

在这里插入图片描述

在SqlSession关闭的时候调用关闭的方法会先调用rollback()方法
在这里插入图片描述
然后调用clearLocalCache()方法进行本地缓存的清空
在这里插入图片描述
当然还有调用update更新语句时也会更新本地一级缓存,我们这里只讨论查询。

问题2: 如果一个SqlSession没有关闭,另一个SqlSession会用到一级缓存吗?

可以用到,因为一级缓存刷新时机是在SqlSession关闭,只要SqlSession没有关闭,多个SqlSession可以共用一个缓存。

问题3:我们在开发过程中,并没有手动关闭SqlSession,那么一级缓存是怎么更新的?

mybatis与spring整合在一起后,因为我们的dao继承了SqlSessionDaoSupport,而SqlSessionDaoSupport内部sqlSession的实现是使用用动态代理实现的,这个动态代理sqlSessionProxy使用一个模板方法封装了select()等操作,每一次select()查询都会自动先执行openSession(),执行完close()以后调用close()方法,相当于生成了一个新的session实例,所以我们无需手动的去关闭这个session()(关于这一点见下面mybatis的官方文档),当然也无法使用mybatis的一级缓存,也就是说mybatis的一级缓存在spring中是没有作用的,所以说为啥mybaits缓存形同虚设,很鸡肋。但是面试官喜欢问,我们还必须了解,哈哈哈…

官方文档摘要

MyBatis SqlSession provides you with specific methods to handle transactions programmatically. But when using MyBatis-Spring your beans will be injected with a Spring managed SqlSession or a Spring managed mapper. That means that Spring will always handle your transactions.

You cannot call SqlSession.commit(), SqlSession.rollback() or SqlSession.close() over a Spring managed SqlSession. If you try to do so, a UnsupportedOperationException exception will be thrown. Note these methods are not exposed in injected mapper classes.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值