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

目录
  • 基本要点
    • 1、缓存
    • 2、一级缓存(默认开启,无法关闭)
    • 3、二级缓存
    • 4、缓存查询原理

基本要点

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缓存内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 深入理解MyBatis中的一级缓存与二级缓存

    前言 先说缓存,合理使用缓存是优化中最常见的,将从数据库中查询出来的数据放入缓存中,下次使用时不必从数据库查询,而是直接从缓存中读取,避免频繁操作数据库,减轻数据库的压力,同时提高系统性能. 一级缓存 一级缓存是SqlSession级别的缓存.在操作数据库时需要构造sqlSession对象,在对象中有一个数据结构用于存储缓存数据.不同的sqlSession之间的缓存数据区域是互相不影响的.也就是他只能作用在同一个sqlSession中,不同的sqlSession中的缓存是互相不能读取的. 一级缓

  • mybatis一级缓存和二级缓存的区别及说明

    目录 结论 源码 一级缓存 二级缓存 我们通常说mybatis中一级缓存是sqlSession级别的,二级缓存是namespace级别的,这篇笔记主要来记录下这么说的原理 结论 先说结论吧,一级缓存之所以说是sqlSession级别的,是因为一级缓存的数据是存放在了sqlSession的一个内部属性中,所以,每次openSession()开启一个sqlSession之后,一级缓存就会失效 二级缓存之所以可以跨sqlSession,是因为二级缓存的数据,是存放在mappedStatement对象中

  • 关于mybatis的一级缓存和二级缓存的那些事儿

    一.缓存是什么 缓存其实就是存储在内存中的临时数据,这里的数据量会比较小,一般来说,服务器的内存也是有限的,不可能将所有的数据都放到服务器的内存里面,所以, 只会把关键数据放到缓存中,缓存因为速度快,使用方便而出名! 二.为什么需要缓存 BS架构里面,用户的所有操作都是对数据库的增删改查,其中查询的操作是最多的,但如果用户想要某个数据时每次都去数据库查询,这无疑会增加数据库的压力,而且获取时间效率也会降低,所以为了解决这些问题,缓存应用而生,使用了缓存之后,服务器只需要查询一次数据库,然后将数据

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

    目录 基本要点 1.缓存 2.一级缓存(默认开启,无法关闭) 3.二级缓存 4.缓存查询原理 基本要点 1.缓存 什么是缓存? 存在内存中的临时数据,我们可以把用户经常查询的数据存放到缓存中,当用户重复查询时,我们可以直接从缓存中查询,提高查询效率,可以解决高并发系统的性能问题 为什么使用缓存? 减少和数据库交互次数,减轻数据库的压力,提高系统效率 什么样的数据能使用缓存? 经常查询且不经常改变的数据 2.一级缓存(默认开启,无法关闭) 1)一级缓存的有效区间是sqlSession从创建到关闭的

  • MyBatis 延迟加载、一级缓存、二级缓存(详解)

    使用ORM框架我们更多的是使用其查询功能,那么查询海量数据则又离不开性能,那么这篇中我们就看下mybatis高级应用之延迟加载.一级缓存.二级缓存.使用时需要注意延迟加载必须使用resultMap,resultType不具有延迟加载功能. 一.延迟加载 延迟加载已经是老生常谈的问题,什么最大化利用数据库性能之类之类的,也懒的列举了,总是我一提到延迟加载脑子里就会想起来了Hibernate get和load的区别.OK,废话少说,直接看代码. 先来修改配置项xml. 注意,编写mybatis.xm

  • Mybatis 一级缓存与二级缓存的实现

    mybatis缓存 mybatis作为一个流行的持久化工具,缓存必然是缺少不了的组件.通过这篇文章,就让我们来了解一下mybatis的缓存. mybatis缓存类型 说起mybatis的缓存,了解过的同学都知道,mybatis中可以有两种缓存类型: 第一种,我们通常称为以及缓存,或者sqlSession级别的缓存,这种缓存是mybatis自带的,如果mapper中的配置都是默认的话,那么一级缓存也是默认开启的. 第二种,就是非sqlSession级别的缓存了,我们通常称为二级缓存,mybatis

  • Mybatis的一级缓存和二级缓存原理分析与使用

    目录 Mybatis的一级缓存和二级缓存 1 Mybatis如何判断两次查询是完全相同的查询 2 二级缓存 2.1 二级缓存配置 2.2 二级缓存特点 2.3 配置二级缓存 2.4 测试 Mybatis的一级缓存和二级缓存 Mybatis会将相同查询条件的SQL语句的查询结果存储在内存或者某种缓存介质中,当下次遇到相同的SQL时不执行该SQL,而是直接从缓存中获取结果,减少服务器的压力,尤其是在查询越多.缓存命中率越高的情况下,使用缓存对性能的提高更明显. Mybatis缓存分为一级缓存和二级缓

  • MyBatis一级缓存与二级缓存原理与作用分析

    目录 缓存的作用 MyBatis 的缓存结构 一级缓存 二级缓存 缓存的作用 在 Web 系统中,最重要的操作就是查询数据库中的数据.但是有些时候查询数据的频率非常高,这是很耗费数据库资源的,往往会导致数据库查询效率极低,影响客户的操作体验.于是可以将一些变动不大且访问频率高的数据,放置在一个缓存容器中,用户下一次查询时就从缓存容器中获取结果. MyBatis 的缓存结构 MyBatis 系统中默认定义了两级缓存:一级缓存和二级缓存: MyBatis 一级缓存是一个 SqlSession 级别,

  • SpringBoot + Mybatis-plus实战之Mybatis-plus的一级缓存、二级缓存

    前言 现在的JAVA行业,貌似已经是SpringBoot + SpringCloud 的天下了,早期的SSH,SSM框架已经老去,与SpringBoot相结合的JPA框架虽然省去了很多的增删改查sql,但是比较笨拙,在面对一些复杂多变的逻辑时常常力不从心,而相对应的Mybatis由于其高度的灵活性受到广大JAVA攻城狮的欢迎.之前整合过了springboot+mybatis,前几天看到一个面试的问一个问题,Mybatis的一级缓存,二级缓存.我想这个应该也是一个重点吧,所以今天决定来详细解读一下

  • Hibernate一级缓存和二级缓存详解

    一.一级缓存二级缓存的概念解释 (1)一级缓存就是Session级别的缓存,一个Session做了一个查询操作,它会把这个操作的结果放在一级缓存中,如果短时间内这个session(一定要同一个session)又做了同一个操作,那么hibernate直接从一级缓存中拿,而不会再去连数据库,取数据: (2)二级缓存就是SessionFactory级别的缓存,顾名思义,就是查询的时候会把查询结果缓存到二级缓存中,如果同一个sessionFactory创建的某个session执行了相同的操作,hiber

  • 关于Spring中一级缓存、二级缓存和三级缓存的那些事

    目录 题记 缓存作用分析 一级缓存.二级缓存.三级缓存区别是什么 总结 题记 常常听到别人提起:“一级缓存.二级缓存.三级缓存”.那么它们是什么呢?有什么作用呢? 缓存作用分析 Spring中的一级缓存名为singletonObjects,二级缓存名为earlySingletonObjects,三级缓存名为singletonFactories,除了一级缓存是ConcurrentHashMap之外,二级缓存和三级缓存都是HashMap.它们的定义是在DefaultSingletonBeanRegi

随机推荐