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判断都无法进去,就会直接走一级缓存查询

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

相关文章

  • Java中BigDecimal使用注意避坑指南

    Java中BigDecimal使用注意避坑指南

    Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算,下面这篇文章主要给大家介绍了关于Java中BigDecimal使用注意避坑的相关资料,需要的朋友可以参考下
    2023-02-02
  • spring boot openfeign从此和httpClient说再见详析

    spring boot openfeign从此和httpClient说再见详析

    这篇文章主要给大家介绍了关于spring boot openfeign从此和httpClient说再见的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起看看吧
    2018-06-06
  • java实现动态数组

    java实现动态数组

    这篇文章主要为大家详细介绍了java实现动态数组,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • SpringBoot如何通过yml方式整合Mybatis

    SpringBoot如何通过yml方式整合Mybatis

    这篇文章主要介绍了SpringBoot如何通过yml方式整合Mybatis,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • java springboot的概述、特点与构建介绍

    java springboot的概述、特点与构建介绍

    大家好,本篇文章主要讲的是springboot的概述、特点与构建介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2021-12-12
  • vue+springboot读取git的markdown文件并展示功能

    vue+springboot读取git的markdown文件并展示功能

    Markdown-it 是一个用于解析和渲染 Markdown 标记语言的 JavaScript 库,使用 Markdown-it,你可以将 Markdown 文本解析为 HTML 输出,并且可以根据需要添加功能、扩展语法或修改解析行为,本文介绍vue+springboot读取git的markdown文件并展示,感兴趣的朋友一起看看吧
    2024-01-01
  • java返回json请求中文变成问号的问题及解决

    java返回json请求中文变成问号的问题及解决

    这篇文章主要介绍了java返回json请求中文变成问号的问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • SpringBoot整合MongoDB的示例

    SpringBoot整合MongoDB的示例

    这篇文章主要介绍了SpringBoot整合MongoDB的示例,帮助大家更好的理解和学习springboot框架,感兴趣的朋友可以了解下
    2020-10-10
  • Ajax实现省市区三级联动

    Ajax实现省市区三级联动

    这篇文章主要为大家详细介绍了jQuery ajax实现省市县三级联动的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能帮助到你
    2021-07-07
  • java中使用Files.readLines()处理文本中行数据方式

    java中使用Files.readLines()处理文本中行数据方式

    这篇文章主要介绍了java中使用Files.readLines()处理文本中行数据方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12

最新评论