返回顶部
首页 > 资讯 > 后端开发 > Python >Java MyBatis本地缓存原理详解
  • 465
分享到

Java MyBatis本地缓存原理详解

2024-04-02 19:04:59 465人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

目录背景发现问题复现解决问题探究缓存的原理sql查询部分深入初见缓存告一段落番外篇-Myabtis创建CacheKey的算法。构造方法结束语背景 出现了一次生产事故,事情是这样的,我

背景

出现了一次生产事故,事情是这样的,我们有一个项目,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本地缓存 内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Java MyBatis本地缓存原理详解

本文链接: https://lsjlt.com/news/153536.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Java MyBatis本地缓存原理详解
    目录背景发现问题复现解决问题探究缓存的原理Sql查询部分深入初见缓存告一段落番外篇-Myabtis创建CacheKey的算法。构造方法结束语背景 出现了一次生产事故,事情是这样的,我...
    99+
    2024-04-02
  • Java关于MyBatis缓存详解
    目录什么是 MyBatis 缓存MyBatis 缓存分类1.⼀级缓存:SqlSession级别,默认开启,并且不能关闭.(默认开启)2.二级缓存:Mapper 级别,默...
    99+
    2024-04-02
  • Java本地缓存
    Java本地缓存 Java实现本地缓存的方式有很多,其中比较常见的有HashMap、Guava Cache、Caffeine和Encahche等。这些缓存技术各有优缺点,你可以根据自己的需求选择适合自己的缓存技术。以下是一些详细介绍: H...
    99+
    2023-08-17
    java 缓存 redis
  • Mybatis缓存详解
     什么是Mybatis缓存  使用缓存可以减少Java Application与数据库的交互次数,从而提升程序的运行效率。比如,查询id=1的user对象,第一次查询出来之后,会自动将该对象保存到缓存中。下...
    99+
    2024-04-02
  • Java本地缓存工具之LoadingCache的使用详解
    目录前言环境依赖代码演示一下总结前言 在工作总常常需要用到缓存,而redis往往是首选,但是短期的数据缓存一般我们还是会用到本地缓存。本文提供一个我在工作中用到的缓存工具,该工具代码...
    99+
    2024-04-02
  • Mybatis 一级缓存和二级缓存原理区别
    目录Mybatis缓存Mybatis一级缓存1.为什么需要Mybatis一级缓存2.Mybatis一级缓存的实现3.Mybatis一级缓存配置Mybatis二级缓存1.为什么需要My...
    99+
    2024-04-02
  • Java实现本地缓存、分布式缓存及多级缓存
    以下均为自己参考其它博主文章或自己理解整理而成,如有错误之处,欢迎在评论区批评指正! 0. 缓存简介        像MySql等传统的关系型数据库已经不能适用于所有的业务场景,比如电商系统的秒杀场景,APP首页的访问流量高峰场景,很容易造...
    99+
    2023-09-17
    java
  • java本地缓存如何实现
    Java本地缓存可以通过多种方式实现,以下是其中几种常用的方法:1. 使用HashMap:可以使用java.util.HashMap...
    99+
    2023-10-21
    java
  • mybatis二级缓存的原理是什么
    MyBatis的二级缓存是指缓存在SqlSessionFactory级别的缓存,可以被多个SqlSession共享。其原理如下:1....
    99+
    2023-10-09
    mybatis
  • 详解vue computed的缓存实现原理
    目录初始化 computed依赖收集派发更新总结一下本文围绕下面这个例子,讲解一下computed初始化及更新时的流程,来看看计算属性是怎么实现的缓存,及依赖是怎么被收集的。 &...
    99+
    2024-04-02
  • MyBatis一级缓存与二级缓存原理与作用分析
    目录缓存的作用MyBatis 的缓存结构一级缓存二级缓存缓存的作用 在 Web 系统中,最重要的操作就是查询数据库中的数据。但是有些时候查询数据的频率非常高,这是很耗费数据库资源的,...
    99+
    2022-12-27
    Mybatis 一级缓存 Mybatis 二级缓存 MyBatis一级缓存和二级缓存
  • MyBatis 延迟加载、一级缓存、二级缓存(详解)
    使用ORM框架我们更多的是使用其查询功能,那么查询海量数据则又离不开性能,那么这篇中我们就看下mybatis高级应用之延迟加载、一级缓存、二级缓存。使用时需要注意延迟加载必须使用resultMap,resultType不具有延迟加载功能。一...
    99+
    2023-05-31
    一级缓存 二级缓存 mybatis
  • MyBatis动态SQL与缓存原理是什么
    今天小编给大家分享一下MyBatis动态SQL与缓存原理是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。动态SQL为什么...
    99+
    2023-07-05
  • 详解Flutter网络图片本地缓存的实现
    目录一、问题二、思路三、实现四、使用五、缓存清理一、问题 Flutter原有的图片缓存机制,是通过PaintingBinding.instance!.imageCache来管理缓存的...
    99+
    2023-05-16
    Flutter网络图片本地缓存 Flutter 图片缓存
  • MyBatis一级缓存与二级缓存原理与作用是什么
    这篇“MyBatis一级缓存与二级缓存原理与作用是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“MyBatis一级缓存与...
    99+
    2023-07-04
  • Mybatis的一级缓存和二级缓存原理分析与使用
    目录Mybatis的一级缓存和二级缓存1 Mybatis如何判断两次查询是完全相同的查询2 二级缓存2.1 二级缓存配置2.2 二级缓存特点2.3 配置二级缓存2.4 测试Mybat...
    99+
    2024-04-02
  • mysql数据库查询缓存原理详解
    这篇文章将为大家详细讲解有关mysql数据库查询缓存原理详解,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。mysql数据库查询缓存原理是:1、缓存SELECT操作...
    99+
    2024-04-02
  • 利用Java如何实现本地缓存
    本篇文章给大家分享的是有关利用Java如何实现本地缓存,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。使用场景在 Java 应用中,对于访问频率高,更新少的数据,通常的方案是将这...
    99+
    2023-05-31
    java 本地缓存 ava
  • 详解MyBatis工作原理
    目录一、Mybatis工作原理二、Mybatis运行原理总结一、Mybatis工作原理 Mybatis分层框架图 Mybatis工作原理图 源码分析:一般都是从helloworl...
    99+
    2024-04-02
  • 详解高性能缓存Caffeine原理及实战
    目录一、简介二、Caffeine 原理2.1、淘汰算法2.1.1、常见算法2.1.2、W-TinyLFU 算法2.2、高性能读写2.2.1、读缓冲2.2.2、写缓冲三、Caffein...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作