首页 > 其他分享 >Mybatis之缓存

Mybatis之缓存

时间:2023-10-13 10:44:20浏览次数:31  
标签:缓存 一级 查询 二级缓存 Mybatis 数据

缓存

简介

引入:

查询数据:需要连接数据库--好资源
解决:把第一次查询的结果放到一个地方,再次查询时直接在这个地方访问就可以(内存--缓存),不需要在访问数据库

什么是缓存?

存在内存中的临时数据
将用户经常查询的数据放在缓存(内存)中,用户去查询数据就不用从磁盘上(关系型数据库查询文件)查询,从缓存中查询,从而提高查询效率,解决了高并发系统的性能问题

为什么使用缓存?

减少和数据库的交互次数,减少系统开销,提高系统效率

什么样的数据可以使用缓存?

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

Mybatis缓存

Mybatis包含一个非常强大的查询缓存特性,它可以非常方便地定制和配置缓存。缓存可以极大的提升查询效率。
Mybatis系统中默认定义了两级缓存:一级缓存和二级缓存
默认情况下,只有一级缓存开启。(SqlSession级别的缓存,也称为本地缓存)
二级缓存需要手动开启和配置,它是基于namespace级别的缓存。
为了提高扩展性,Mybatis定义了缓存接口Cache,我们可以通过实现Cache接口来自定义二级缓存。

一级缓存

一级缓存也叫本地缓存:

一级缓存是默认开启的,不能关闭
与数据库同一次会话期间查询到的数据会放在本地缓存中
以后如果需要获取相同的数据,直接从缓存中拿,没必要再去查询数据库
一级缓存相当于一个Map

测试步骤:

开启日志
测试执行
查看日志和运行结果

在这里插入图片描述

缓存失效的情况:

增删改操作可能会刷新数据库中的数据,因此会进行缓存的刷新
查询不同的数据
手动清理缓存

二级缓存

二级缓存也叫全局缓存,一级缓存作用域太低了,所以诞生了二级缓存

基于namespace级别的缓存,一个名称空间,对应一个二级缓存

工作机制:

一个会话查询一条数据,这个数据就会被放在当前会话的一级缓存中
如果当前会话关闭了,这个会话对应的一级缓存就没了;但是我们想要的是,会话关闭了,一级缓存中的数据被保存到二级缓存中;
新的会话查询信息,就可以从二级缓存中获取内容;
不同的mapper查出的数据就会放在自己对应的缓存(map)中

测试步骤:

  • 显示的开启全局缓存(二级缓存),虽然默认的就是开启的

    <!-- 在Mybatis-config.xml中配置 显示的开启全局缓存(二级缓存)--> <setting name="cacheEnabled" value="true"/>

  • 在当前的XxMapper.xml文件中使用二级缓存

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

    错误:Cause: java.io.NotSerializableException: com.my.pojo.User(实体类序列化)

使用二级缓存要注意:

所有数据刚开始都会先放在一级缓存中,等到一级缓存sqlSession关闭后,才会将数据存放到二级缓存中(前提是开启了二级缓存)

缓存原理

在这里插入图片描述

自定义缓存-ehcache(了解)

标签:缓存,一级,查询,二级缓存,Mybatis,数据
From: https://www.cnblogs.com/kuangshenmentu/p/17761542.html

相关文章

  • 第一个Mybatis项目
    1.mybatis-config.xml配置及pom文件<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEconfiguration    PUBLIC"-//mybatis.org//DTDConfig3.0//EN"    "https://mybatis.org/dtd/mybatis-3-config.dtd"><c......
  • mybatisplus根据两个字段进行更新或新增
    注意:使用@Builder注解时,要加上无参构造器,否则无法更新 @Override@TransactionalpublicvoidsaveManufacturerInfo(List<Manufacturer>manufacturerList){List<ManufacturerMap>codeNameMapping=manufacturerList.stream().map(item->ManufacturerMap.......
  • Mybatis-Flex核心功能之@Id
    1、是什么?在Entity类中,MyBatis-Flex是使用@Id注解来标识主键的2、怎么玩?public@interfaceId{/***ID生成策略,默认为none**@return生成策略*/KeyTypekeyType()defaultKeyType.None;/***若keyType类型是seque......
  • MyBatis使用细节
    一、别名在核心配置文件中使用<typeAliases>标签配置别名。别名可以用于映射文件中的resultType属性。1.直接配置别名<typeAliases><!--type:类型全限定路径alias:别名名称--><typeAliastype="com.gsy.pojo.People"alias="p"></typeAlias>......
  • mybatis动态方法
    一、首先创建数据库二、创建项目工程先导入文件编写配置文件db.propertiesdriver=com.mysql.jdbc.Driverurl=jdbc:mysql://localhost:3306/dbusername=rootpassword=rootconfig.xml<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEconfigurationPUBLIC"-//mybat......
  • java项目使用Mybatis-Plus插件,QueryWrapper日期开始-结束范围查询
    1、参数开始日期startTime、结束日期endTime挺好用,开始日期、结束日期当天都包含进去了,如果使用qw.between("create_time",startTime,endTime)方法是不含endTime结束日期当天的qw.apply(bCulresCardMvVO.getStartTime()!=null,"date_format(create_time,......
  • mybatis游标使用
    RowData  RowDataDynamic:流式查询。一次只查询一条数据,next()时会查询下一条。(占用数据库连接)需要设置resultSetType=ResultType.FORWARD_ONLY,并且fetchSize一定要等于Integer.MIN_VALUE原因在这com.mysql.jdbc.StatementImpl#createStreamingResultSet 使用方式......
  • 如何保证缓存与数据库双写时的数据一致性
    1、背景在做系统优化时,想到了将数据进行分级存储的思路。因为在系统中会存在一些数据,有些数据的实时性要求不高,比如一些配置信息。基本上配置了很久才会变一次。而有一些数据实时性要求非常高,比如订单和流水的数据。所以这里根据数据要求实时性不同将数据分为三级。第1级:订单数据和......
  • 第四节:Redis数据持久化机制(备份恢复)、缓存淘汰策略、主从同步原理、常见规范与优化
    一.数据持久化 1. 含义Redis提供了RDB和AOF两种持久化方式,默认开启的是RDB,如果需要AOF,需要手动修改配置文件进行开启。RDB:是一种对Redis存在内存中的数据周期性的持久化机制,将内存中的数据以快照的形式硬盘,实质上是fork了一个子进程在执行数据存储,采用的是二进制压......
  • 简述MyBatis动态SQL
    简述MyBatis动态SQL前言 MyBatis是一个用于Java持久层的开源框架,它提供了一种简化数据库访问的方式。MyBatis的动态SQL功能允许我们根据不同的条件动态生成SQL语句,以实现更灵活的数据库操作。在MyBatis中,我们经常使用以下标签来编写动态SQL:<if/>作用:用于实现简单的条......