Mybatis源码分析之缓存

一、MyBatis缓存介绍

  正如大多数持久层框架一样,MyBatis 同样提供了一级缓存二级缓存的支持

  1. 一级缓存: 基于PerpetualCache 的 HashMap本地缓存,其存储作用域为 Session,当 Session flush 或 close 之后,该Session中的所有 Cache 就将清空

  2. 二级缓存与一级缓存其机制相同,默认也是采用 PerpetualCache,HashMap存储,不同在于其存储作用域为 Mapper(Namespace)并且可自定义存储源,如 Ehcache。

  3. 对于缓存数据更新机制,当某一个作用域(一级缓存Session/二级缓存Namespaces)的进行了 C/U/D 操作后,默认该作用域下所有 select 中的缓存将被clear。

一级缓存:使用同一个session


第一次执行到CachingExecutor时获得List为空,则执行SQL语句获取结果,并将list保存到tcm中。


第二次获取数据的时候不为空,则直接返回结果


上述过程是Mybatis默认开启的一级缓存,只在同一个session中有效。当创建两个session时缓存就无效了,就不给截图了。

Mybatis提供了二级缓存,其存储作用域为一个Mapper,因此当创建两个session时,其仍然有效。

开启二级缓存:在Mapper文件中添加<cache/>


创建两个session:


两次访问结果与默认开启缓存一致。

可能我们还有一个疑问,为什么配置了<cache/>之后开启二级缓存,不同的session在同一个Mapper中配置有效,下图可以解答我们的困惑,当在Mapper文件中配置<cache/>时,cache = ms.getCahce()不为空,否则为空,同时MappedStatement其实对应的是一个Statement 的Id,因此在同一个Mapper文件中的MappedStatement对象getCache都不为空,所有二级缓存的作用域在同一个Mapper中,不同的Session都会包含同一个MappedStatement对象,因此和Session无关,而一级缓存其实是将缓存保存到下图的tcm中的,不同的session包含不同的tcm对象。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值