Java MyBatis本地缓存原理详解

 更新时间:2022年07月05日 14:30:06   作者:​ 江粒   ​  
这篇文章主要介绍了Java MyBatis本地缓存原理详解,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下

背景

出现了一次生产事故,事情是这样的,我们有一个项目,Java访问数据库的框架使用的是MyBatis。然后一个业务员在系统中查询了一个订单,发现这个订单是未支付的状态,于是业务员联系客户,让客户支付,客户支付完成后,业务员又去系统查询,结果还是未支付状态,刷新了页面也是一样,不过过了一会就好了。业务员把这个延迟问题,反馈给了我们。我就看代码,只是一个简单的select * from order where id = ?语句调用。这个时候就想到了我们今天故事的主角,MyBatis的缓存机制。

发现问题

复现

public class Main {
  public static void main(String[] args) throws IOException, InterruptedException {
    SqlSessionFactory build = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
    UsersMapper mapper = build.openSession().getMapper(UsersMapper.class);
    List<Users> users = mapper.selectAll();
    System.out.println(JSONUtil.toJsonStr(users));

    // 在这睡眠期间去使用update语句修改数据库信息。
    Thread.sleep(1000 * 10);
    List<Users> users1 = mapper.selectAll();
    System.out.println(JSONUtil.toJsonStr(users1));

  }
}

看到上面的问题,很自然的就想到之前面试时候背的八股文,MyBatis的一二级缓存。

解决问题

其实这个问题,对于实效性不强的项目的话,完全可以和业务说,网络延迟,等一等就可以了。 如果说实用性比较强的项目,可以选择禁用这个缓存。不过这样也会带来一个问题,也就是没有缓存后,很多查询,查询结果相同的SQL语句,原本只需要执行一遍就可以,这里会请求很多次。增高DB的IO负担。

探究缓存的原理

Sql查询部分深入

在上一篇Java MyBatis是如何执行一条SQL语句的讲MyBatis的文章中已经说到了,mapper会经过动态代理去执行SqlSession的query方法。

阅读缓存部分源码,需要跟随查询方法往下追着看。

接着,我们这里可以看到,一个Switch有很多的case,很显而易见,我们会进入Select中,随后Select的代码块中,又有很多个If判断,因为我们的方法返回的是一个List,正好就命中了returnsMany方法。

最终调用SqlSession中的Select方法,到达这里接着往里追。

到达执行器处理SQL语句的这一块了,可见封装了很多层,再往下追。

初见缓存

看到这里,终于见到缓存相关字样了,这里去CreateCacheKey,看到这里我突然想起了,刚工作时候的一次面试,有个傻*面试官,问我说MyBatis的缓存Key是怎么生成,当时我真想给他两耳巴。继续抠下面的query方法,可以看到把上面生成的key作为参数传了下来。

追到这里就可以看到一个比较关键的代码了,从localCache中调用了GetObject方法
这里看到下面的方法,从这里可以证明,MyBatis默认就是用本地缓存,所以写代码的时候自然也要记得处理缓存不一致的问题。

告一段落

到这里这一篇文章就结束了。一般来说,作为Java工程师,在工作中还是经常用到MyBatis这个点的,如果你在面试中真的问到了这么一道缓存题。而那么巧你就知道,那么郎有情,妾有意,恭喜您,点亮涨薪1K的成就。希望大家在当前大环境这么不好的情况下,多多学习,多多面试,提高核心竞争力,等大环境回暖各个年入50万+。

番外篇-Myabtis创建CacheKey的算法。

回到这一行代码,可以看到这个方法返回的是一个CacheKey的JavaClass,先不急着看这个方法的具体实现,先去看下这个类的构成,和构造方法。

构造方法

这个CacheKey类一共有两个构造方法,可以看到的在有参构造方法中,调用了无参方法,随后调用了,updateAll方法,能在构造中被调用的一般都是比较重要的,一会来看一下这个方法的实现,先来看下无参构造中的几个变量。
hashcode、multiplier、cout、updateList,值得注意的是hashCode和multiplier两个成员变量,都给赋值了初始值。

这两个变量记忆一下,然后去看updateAll方法。

这个方法比较简单,遍历了objects入参,传入update方法,继续去追update方法。

看到这里可以看出这里大概是计算HashCode的一个地方。只是最后会把算过的值放入UpdateList中。

随后去看这个类的tostring方法。

这里也就是具体的方法了

根据冒号分割,hashCode:checkSum:updateList的每个元素

再回过头来看一下CreateCacheKey方法看下最后生成是什么

最后答案留给评论互动吧。

结束语

到此这篇关于Java MyBatis本地缓存原理详解的文章就介绍到这了,更多相关Java MyBatis本地缓存 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java Web使用POI导出Excel的方法详解

    Java Web使用POI导出Excel的方法详解

    这篇文章主要介绍了Java Web使用POI导出Excel的方法,结合实例形式详细分析了Java Web使用POI导出Excel的具体操作步骤、实现技巧与相关注意事项,需要的朋友可以参考下
    2017-06-06
  • Spring事务框架之TransactionStatus源码解析

    Spring事务框架之TransactionStatus源码解析

    这篇文章主要为大家介绍了Spring事务框架之TransactionStatus源码示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • Java微信公众平台开发(1) 接入微信公众平台

    Java微信公众平台开发(1) 接入微信公众平台

    这篇文章主要为大家详细介绍了Java微信公众平台开发第一步,接入微信公众平台,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-04-04
  • LeetCode程序员面试题之无重复字符的最长子串

    LeetCode程序员面试题之无重复字符的最长子串

    Java计算无重复字符的最长子串是一种常见的字符串处理算法,它的目的是找出一个字符串中无重复字符的最长子串。该算法可以很好地解决一些字符串处理问题,比如寻找字符串中重复字符的位置,以及计算字符串中无重复字符的最长子串的长度。
    2023-02-02
  • 关于maven:pom文件的使用解析

    关于maven:pom文件的使用解析

    这篇文章主要介绍了关于maven:pom文件的使用说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • Java并发之搞懂读写锁

    Java并发之搞懂读写锁

    这篇文章主要介绍了Java并发之读写锁,文中相关实例代码详细,测试可用,具有一定参考价值,需要的朋友可以了解下,希望能够给你带来帮助
    2021-11-11
  • SpringBoot项目中接口防刷的完整代码

    SpringBoot项目中接口防刷的完整代码

    本文通过实例代码给大家介绍了SpringBoot项目中接口防刷的方法,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2021-07-07
  • 浅谈springmvc的DispatcherServlet分析

    浅谈springmvc的DispatcherServlet分析

    本篇文章主要介绍了浅谈springmvc的DispatcherServlet分析,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • Spring实现拥有者权限验证的方法示例

    Spring实现拥有者权限验证的方法示例

    这篇文章主要介绍了Spring实现拥有者权限验证的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • Mybatis 批量更新实体对象方式

    Mybatis 批量更新实体对象方式

    这篇文章主要介绍了Mybatis 批量更新实体对象方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11

最新评论