一文带你掌握Mybatis二级缓存源码中Cache标签解析

这是我参与11月更文挑战的第23天,活动详情查看:2021最后一次更文挑战

Mybatis二级缓存源码中Cache标签解析

Mybatis缓存结构图

image.png

有上图可知:⼆级缓存构建在⼀级缓存之上,在收到查询请求时,MyBatis⾸先会查询⼆级缓存,若⼆级缓存未命中,再去查询⼀级缓存,⼀级缓存没有,再查询数据库。 顺序就是 二级缓存 ---》一级缓存 ---》数据库

与一级缓存不同的是,⼆级缓存和具体的命名空间绑定,⼀个Mapper中有⼀个Cache,相同Mapper中的MappedStatement共⽤⼀个Cache,⼀级缓存则是和SqlSession绑定。一个Mapper可能有多个SqlSession,但是只有一个Cache。

如何启用二级缓存

  • 开启全局⼆级缓存配置
<settings>
<setting name="cacheEnabled" value="true"/>
</settings>
复制代码
  • 在需要使⽤⼆级缓存的Mapper配置⽂件中配置标签
<cache></cache>
复制代码
  • 在具体CURD标签上配置useCache=true
<select id="findById" resultType="com.test.pojo.User" useCache="true">
select * from user where id = #{id}
</select>
复制代码

标签< cache />的源码解析

如何解析cache标签属性

根据Mybatis前两篇Mybatis源码剖析,可以知道xml的解析⼯作主要交给XMLConfigBuilder.parse()⽅法来实现。

image.png

因为标签chache配置在mapper的映射配置文件中,因此,我们直接看关于mappers标签的解析

image.png

XMLMapperBuilder配置文件的作用是,解析映射配置文件,执行mapperParser.parse()方法进行解析

image.png

通过configurationElement方法中有cache标签的解析处理‘

image.png

通过源码可知:针对与cache相关方法有两个,一个是cacheRefElement方法,主要是解析cache-ref标签,该标签作用是,在当前mapper中引入其他缓存,一个是cacheRefElement方法,主要是解析cache标签

image.png

通过cacheRefElement方法就可以解析cache标签里面所有的属性,然后通过这些属性使用useNewCache方法构造一个cache对象,至此cache标签解析已经完成

image.png

如何构建Cache对象

image.png

我们看到⼀个Mapper.xml只会解析⼀次标签,也就是只创建⼀次Cache对象,放进configuration中,并将cache赋值给MapperBuilderAssistant.currentCache

我们看到将Mapper中创建的Cache对象,加⼊到了每个MappedStatement对象中,也就是同⼀个Mapper中所有的。

至此,Cache标签源码解析已经完成,明天会进一步分析

おすすめ

転載: juejin.im/post/7034406399312560164