Mybatis详细对比一级缓存与二级缓存

 更新时间:2022年10月10日 11:22:40   作者:Decade0712  
MyBatis 包含一个非常强大的查询缓存特性,它可以非常方便地配置和定制,缓存可以极大的提升查询效率。MyBatis中默认定义了两级缓存,分别是一级缓存和二级缓存

基本要点

1、缓存

什么是缓存?

存在内存中的临时数据,我们可以把用户经常查询的数据存放到缓存中,当用户重复查询时,我们可以直接从缓存中查询,提高查询效率,可以解决高并发系统的性能问题

为什么使用缓存?

减少和数据库交互次数,减轻数据库的压力,提高系统效率

什么样的数据能使用缓存?

经常查询且不经常改变的数据

2、一级缓存(默认开启,无法关闭)

1)一级缓存的有效区间是sqlSession从创建到关闭的过程

假设我们重复执行同一条查询语句,如下图所示

我们可以看出,程序只会连接数据库查询一次,后面的查询结果都从缓存中取出

2)一级缓存失效的几种情况

  • 查询不同的东西(前后2次的查询不一样,会刷新缓存)
  • 执行insert、update 和 delete 语句后会刷新缓存(增删改操作可能会改变原来的数据,所以必定会刷新缓存)
  • 查询不同的Mapper.xml
  • 手动清除缓存,两次查询中间调用了sqlSession.clearCache()方法

3、二级缓存

1)定义

二级缓存是基于namespace级别的缓存,可以理解为单个Mapper级别的缓存

建议将SQL映射文件涉及到的实体类序列化,即实现Serializable接口,防止出现报错

2)工作机制

  • 所有的查询数据都会先放在一级缓存中,当会话commit或者sqlSession关闭时,系统会把一级缓存中的数据传递到二级缓存中
  • 当xml文件再次被调用且执行相同的查询操作时,直接从Mapper的缓存中查
  • 不同的mapper查出的数据会放在自己对应的缓存中

3)开启步骤:

首先去mybatis-config.xml中开启全局缓存

<settings>
    <setting name="cachaEnable" value="value"/>
</setting>

在SQL映射文件文件中启用全局的二级缓存

如下,我们创建了一个清除策略为 FIFO 的缓存,每隔 60 秒刷新

最多可以存储结果对象或列表的 512 个引用,返回的对象被认为是只读的

如果不需要参数,直接使用<cache/>即可

<cache
  eviction="FIFO"
  flushInterval="60000"
  size="512"
  readOnly="true"/>

4)缓存的几种清除策略(主要了解以下2种)

  • LRU – 最近最少使用:移除最长时间不被使用的对象。
  • FIFO – 先进先出:按对象进入缓存的顺序来移除它们。
  • SOFT – 软引用:基于垃圾回收器状态和软引用规则移除对象。
  • WEAK – 弱引用:更积极地基于垃圾收集器状态和弱引用规则移除对象

4、缓存查询原理

我们的查询请求会先去二级缓存中查看有没有数据

如果没有,就会去一级缓存中查有没有

如果都没有,再连接数据库查询

到此这篇关于Mybatis详细对比一级缓存与二级缓存的文章就介绍到这了,更多相关Mybatis缓存内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java实现文件点击没反应的方法

    Java实现文件点击没反应的方法

    jsp页面链接,点击访问action用IO流去下载服务器上的文件,问题是任凭怎么点击都没反应,日志也不报错。这篇文章给大家介绍Java实现文件点击没反应的方法,需要的朋友参考下吧
    2018-07-07
  • IDEA教程创建SpringBoot前后端分离项目示例图解

    IDEA教程创建SpringBoot前后端分离项目示例图解

    在使用spring、mybatis等框架时,配置文件很复杂,有时复杂的让人想放弃Java,使用C#。springboot出现这一切问题就都不是问题
    2021-10-10
  • Java中Date与String相互转换的方法

    Java中Date与String相互转换的方法

    这篇文章主要为大家详细介绍了Java中Date与String相互转换方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-10-10
  • Java8中的default关键字详解

    Java8中的default关键字详解

    这篇文章主要介绍了Java8中的default关键字详解,在实现某个接口的时候,需要实现该接口所有的方法,这个时候default关键字就派上用场了。通过default关键字定义的方法,集成该接口的方法不需要去实现该方法,需要的朋友可以参考下
    2023-08-08
  • Spring AOP里的静态代理和动态代理用法详解

    Spring AOP里的静态代理和动态代理用法详解

    这篇文章主要介绍了 Spring AOP里的静态代理和动态代理用法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • SpringBoot拦截器以及源码详析

    SpringBoot拦截器以及源码详析

    拦截器在我们平时的项目中用处有很多,如:日志记录(我们后续章节会讲到)、用户登录状态拦截、安全拦截等等,所以下面这篇文章主要给大家介绍了关于SpringBoot拦截器以及源码的相关资料,需要的朋友可以参考下
    2021-07-07
  • java实现图片压缩的思路与代码

    java实现图片压缩的思路与代码

    这篇文章主要为大家详细介绍了java实现图片压缩的思路与代码,将较大的图片按照指定的宽高,以宽为基准,或高为基准按照等比例压缩图片,感兴趣的小伙伴们可以参考一下
    2016-03-03
  • Java Volatile关键字你真的了解吗

    Java Volatile关键字你真的了解吗

    这篇文章主要为大家介绍了Java Volatile关键字,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2021-12-12
  • Java数据结构之栈的基本定义与实现方法示例

    Java数据结构之栈的基本定义与实现方法示例

    这篇文章主要介绍了Java数据结构之栈的基本定义与实现方法,简单描述了数据结构中栈的功能、原理,并结合java实例形式分析了栈的基本定义与使用方法,需要的朋友可以参考下
    2017-10-10
  • Springboot如何集成websocket

    Springboot如何集成websocket

    这篇文章主要介绍了Springboot如何集成websocket问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07

最新评论