mybatis二级缓存默认未开启源码的问题

 更新时间:2022年11月21日 10:18:50   作者:小小少年_  
这篇文章主要介绍了mybatis二级缓存默认未开启源码的问题及说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

说明

mybatis的二级缓存,我们通常说,默认是关闭的,这个结论是没有问题的,但是我觉得有几个点需要说明白

二级缓存的时候,需要有几个配置必须开启,二级缓存才会生效

  • 1.全局配置文件中的cacheEnable属性设置为true
  • 2.mapper.xml文件中,配置节点
  • 3.mapper.xml文件中,select语句的useCache配置为true

这三者同时满足,才会使用二级缓存

上面这三个配置,在源码中,解析了之后,分别对应这三个类中的属性

我们知道,mybatis中的配置文件,在解析了之后,最终会把所有解析的结果,映射到一个类中org.apache.ibatis.session.Configuration

  • 1.对应着 configuration.cacheEnabled属性
  • 2.对应着 Configuration --> mappedStatements --> cache
  • 3.对应着 Configuration --> mappedStatements --> useCache

我们常说二级缓存默认是关闭的,并不是说这三个配置默认都没有配置,翻了源码之后,默认不做任何配置的情况下:

  • 1.全局配置文件中的CacheEnable属性,默认是true
  • 2.mapper.xml文件中的节点如果没有配置, 那MappedStatement对象中的cache属性为null
  • 3.如果select语句的useCache没有配置,select语句默认是true,其他是false

所以,虽然这种也是默认关闭的,但是我觉得需要说明白,并不是二级缓存用到的这几个属性默认都是false

源码

针对这三个配置,我们来看下默认的配置对应的源码

cacheEnable

对CacheEnable的解析是在

org.apache.ibatis.builder.xml.XMLConfigBuilder#parseConfiguration

我们接着来看赋值的逻辑这里,如果props为空(就是在全局配置文件中没有配置settings节点),此时在给各个属性赋值的时候,分别指定了默认值,可以看到,cacheEnable属性值默认是true;所以这里可以证明

第一点

节点的解析

org.apache.ibatis.builder.xml.XMLMapperBuilder#configurationElement

由于我没有配置cache节点,所以,这里为null,不会执行下面的useNewCache方法,为了证明第二点这个说法,我们假设此时指定了cache节点,我们来看下useNewCache()方法中会做什么

可以看到,在useNewCache方法中,初始化了cache之后,会把cache赋值在当前类的一个属性中,currentCache;为什么要关注这个属性?

因为后面在给mappedStatement的cache属性赋值时,会使用currentCache;

截止到这里,我们只需要知道,如果在mapper.xml文件中,没有配置节点,那org.apache.ibatis.builder.MapperBuilderAssistant#currentCache这个属性就是null

useCache的解析

org.apache.ibatis.builder.xml.XMLStatementBuilder#parseStatementNode

这个方法是解析了一个sql段之后的逻辑,可以看到,这里所有的属性,都是我们在中可以设置的,其中有一个useCache属性

看下这里的意思:

  • 如果useCache这个属性为null,就会直接返回def 就是默认值,可以看到这里的默认值是isSelect;isSelect是在上面赋值的,如果当前是select语句,就是true,如果当前是非select,就是false;

其含义是:

  • 如果没有配置useCache属性,select语句默认使用二级缓存,其他语句不使用

这里只是给useCache赋值了,我们看下在哪里把这个赋值放到了mappedStatement对象中

builderAssistant.addMappedStatement(id, sqlSource, statementType, sqlCommandType,
fetchSize, timeout, parameterMap, parameterTypeClass, resultMap, resultTypeClass,
resultSetTypeEnum, flushCache, useCache, resultOrdered,
keyGenerator, keyProperty, keyColumn, databaseId, langDriver, resultSets);

在解析了所有的属性之后,会调用这个方法,给mappedStatent对象赋值

在赋值这里,有两个重要的代码段

第一个是使用useCache赋值,这里使用的就是前面入参的;使用currentCache给cache属性赋值,我们前面有说过,如果在mapper.xml文件中,没有配置节点,那此时的currentCache就是null

第二个:是把当前的mappedStatement对象添加到configuration的mappedStatements属性中

使用二级缓存源码

所以以上可以证明这三个配置对应的默认值,我们再来看下,sql在真正执行时,是如何使用二级缓存的

上面有说过,默认的CacheEnable属性默认是true,所以在初始化executor对象的时候,默认会初始化CachingExecutor对象,所以,无论是否使用了二级缓存,都会先调用到cachingExecutor对象中

可以看到,在真正调用二级缓存前,会有两层判断,分别是cache和useCache;这两个配置,cache默认是null,useCache默认是true,默认情况下,第一个if判断都无法进去,就会直接走一级缓存查询

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • MyBatis与Hibernate的比较

    MyBatis与Hibernate的比较

    Hibernate 与Mybatis都是流行的持久层开发框架,但Hibernate开发社区相对多热闹些,支持的工具也多,更新也快,当前最高版本4.1.8。而Mybatis相对平静,工具较少,当前最高版本3.2
    2016-01-01
  • java如何实现自动生成数据库设计文档

    java如何实现自动生成数据库设计文档

    以前我们还需要手写数据库设计文档、现在可以通过引入screw核心包来实现Java 数据库文档一键生成。本文将具体介绍一下如何通过java自动生成数据库设计文档,需要的朋友可以参考下
    2021-11-11
  • java 垃圾回收机制以及经典垃圾回收器详解

    java 垃圾回收机制以及经典垃圾回收器详解

    这篇文章主要介绍了java 垃圾回收机制以及经典垃圾回收器详解,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • java IO实现电脑搜索、删除功能的实例

    java IO实现电脑搜索、删除功能的实例

    下面小编就为大家带来一篇java IO实现电脑搜索、删除功能的实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-12-12
  • 详解Jmeter线程组的设置方法

    详解Jmeter线程组的设置方法

    本文主要介绍了Jmeter线程组的设置方法,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • Java SpringBoot操作Redis

    Java SpringBoot操作Redis

    这篇文章主要介绍了SpringBoot如何操作Redis,文章中有详细的代码示例,有一定的参考价值,感兴趣的同学可以参考阅读
    2023-04-04
  • Java实战之实现一个好用的MybatisPlus代码生成器

    Java实战之实现一个好用的MybatisPlus代码生成器

    这篇文章主要介绍了Java实战之实现一个好用的MybatisPlus代码生成器,文中有非常详细的代码示例,对正在学习java的小伙伴们有非常好的帮助,需要的朋友可以参考下
    2021-04-04
  • 如何在springboot项目中自定义404页面

    如何在springboot项目中自定义404页面

    今天点击菜单的时候不小心点开了一个不存在的页面,然后看到浏览器给的一个默认的404页面,这篇文章主要介绍了如何在springboot项目中自定义404页面,需要的朋友可以参考下
    2024-05-05
  • 使用Spring事物时不生效的场景及解决方法

    使用Spring事物时不生效的场景及解决方法

    今天介绍一下Spring事物不生效的场景,事物是我们在项目中经常使用的,如果是Java的话,基本上都使用Spring的事物,不过Spring的事物如果使用不当,那么就会导致事物失效或者不回滚,最终导致数据不一致,下面我们意义列举不生效的场景,并给出解决方法
    2023-09-09
  • java数据结构算法稀疏数组示例详解

    java数据结构算法稀疏数组示例详解

    这篇文章主要为大家介绍了java数据结构算法稀疏数组示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06

最新评论