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文件中添加


创建两个session:


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

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


你可能感兴趣的:(myBatis入门及源码学习,Mybatis入门及源码学习)