springboot缓存篇之mybatis一级缓存和二级缓存

前言

相信很多人都用过mybatis,这篇文章主要是介绍mybatis的缓存,了解一下mybatis缓存是如何实现,以及它在实际中的应用

一级缓存

什么是mybatis一级缓存?我们先看一个例子:

@GetMapping("/list")
public Result<Void> listGoods(){GoodsExample goodsExample = new GoodsExample();goodsMapper.selectByExample(goodsExample);goodsMapper.selectByExample(goodsExample);return Result.okWithNullData();
}

上面这个例子有两个相同的查询方法,我们看看日志

在这里插入图片描述

我们看到即使两个查询方法一样,它也查询了两次数据库。mybatis为了优化这种情况,既然两次查询语句一样,那么就将第一次结果缓存起来,那么第二次查询就不用再查数据库。

其实要实现这个功能也是挺简单的,你只需在方法上加上@Transactional即可

@Transactional
public Result<Void> listGoods(){// 代码省略
}

再看看运行日志

在这里插入图片描述

我们可以看到只有一次查询,正常情况下每发起一次查询就会创建一个SqlSession,查询结束了,SqlSession就会被销毁。如果开启了事务,那么就可以为多个查询创建一个共同的SqlSession,那么在同一个事务中,如果说存在相同的查询,那么后面的查询都会直接拿第一次查询的结果。

这么看来,mybatis的一级缓存还不错,但现实告诉你如果你的项目比较大,比较复杂,比如分布式,如果使用mybatis的一级缓存,很容易就踩坑了,因此一些大公司都会要求禁用它,而使用redis

mybatis是默认开启一级缓存的,如果要关闭,可以在配置文件这样配置:

# 默认值是session,如果要关闭,设置成statement即可
mybatis.configuration.local-cache-scope=statement

为什么说很容易踩坑呢?

其实简单来说就是第一次缓存的结果,被另外的线程更新了,那么如果后面再拿到的数据就是脏数据。

总之禁用它,使用redis代替它准没错

二级缓存

假如说现在有100个请求在同一时间请求列表数据,就上面那段代码而言,正常情况下要查询200次数据库

@GetMapping("/list")
public Result<Void> listGoods(){GoodsExample goodsExample = new GoodsExample();// 第一次查询goodsMapper.selectByExample(goodsExample);// 第二次查询goodsMapper.selectByExample(goodsExample);return Result.okWithNullData();
}

如果开启了一级缓存,那么也要查询100次,因此mybatis就提供了二级缓存

二级缓存的设置也很简单,只需在Mapper.xml文件中加上cache标签即可

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.dao.mapper.GoodsMapper"><!--缓存标签--><cache></cache><resultMap id="BaseResultMap" type="com.example.demo.domain.entity.Goods"><id column="id" jdbcType="BIGINT" property="id" /><result column="goods_name" jdbcType="VARCHAR" property="goodsName" /><result column="number" jdbcType="INTEGER" property="number" /><result column="create_time" jdbcType="TIMESTAMP" property="createTime" /><result column="update_time" jdbcType="TIMESTAMP" property="updateTime" /></resultMap><!--省略代码-->

当我们再次请求list接口时,看看控制台的日志

在这里插入图片描述

我们可以看到除了第一次查询要查询数据库外,后面的几次查询列表都是直接从缓存中拿数据

mybtais二级缓存看上去好像挺好用的,但现实当中还是给你来个暴击,最好不要用。

我们要搞清楚它的作用范围,它时针对命名空间的,就比如说上面提到的mapper.xml,如果说你部署在一个节点,那么就只有一个mapper.xml,缓存的结果直接从这个空间下获取即可,但很多时候随着业务的增大可能要部署多个节点,那每个节点都有自己的mapper.xml,而每个节点更新缓存只会更新自己节点的mapper.xml,因此可能会出现下面的问题

客户端有个请求过来,从A节点获取列表数据的,如果有缓存查缓存,没有就查数据库,比如说meta 60产品数据,它的价格时6000元

客户端再发个请求过来,从B节点获取列表数据的,如果有缓存查缓存,没有就查数据库,比如说meta 60产品数据,它的价格时6000元

这是没有问题的,但现在管理人员调整了产品价格,从6000改成5000,他的这次更新请求刚好请求了B节点(客户端请求节点是随机的),此时B节点缓存刷新了

那现在是不是会出现这样的情况,有些用户看到的商品价格是6000(刚好访问了A节点,直接读取缓存),有些用户看到的价格却是5000(请求了B节点,B节点会重新查库)

所以mybtais二级缓存慎用!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/114615.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Mysql】B+树索引的使用(七)

前言 每个索引都对应一棵 B 树&#xff0c; B 树分为多层&#xff0c;最下边一层是叶子节点&#xff0c;其余的是内节点&#xff08;非叶子节点&#xff09;。所有用户记录都存储在 B 树的叶子节点&#xff0c;所有目录项记录都存储在内节点。 InnoDB 存储引擎会自动为主键&am…

Node学习笔记之包管理工具

一、概念介绍 1.1 包是什么 『包』英文单词是package &#xff0c;代表了一组特定功能的源码集合 1.2 包管理工具 管理『包』的应用软件&#xff0c;可以对「包」进行 下载安装 &#xff0c; 更新 &#xff0c; 删除 &#xff0c; 上传 等操作 借助包管理工具&#xff0c;可…

推理引擎之模型压缩浅析

目录 前言1. 模型压缩架构和流程介绍2. 低比特量化原理2.1 量化基础介绍2.2 量化方法2.3 量化算法原理2.4 讨论 3. 感知量化训练QAT原理3.1 QAT原理3.2 量化算子插入3.3 QAT训练流程3.4 QAT衍生研究3.5 讨论 4. 训练后量化PTQ4.1 动态PTQ4.2 静态PTQ4.3 KL散度实现静态PTQ4.4 量…

最详细STM32,cubeMX 定时器

这篇文章将详细介绍 STM32,cubeMX 定时器的配置和使用。 文章目录 前言一、定时器基础知识二、cubeMX 配置三、定时时长四、自动生成代码讲解五、实验程序总结 前言 实验开发板&#xff1a;STM32F103C8T6。所需软件&#xff1a;keil5 &#xff0c; cubeMX 。实验目的&#xff…

无人机UAV目标检测与跟踪(代码+数据)

前言 近年来&#xff0c;随着无人机的自主性、灵活性和广泛的应用领域&#xff0c;它们在广泛的消费通讯和网络领域迅速发展。无人机应用提供了可能的民用和公共领域应用&#xff0c;其中可以使用单个或多个无人机。与此同时&#xff0c;我们也需要意识到无人机侵入对空域安全…

牛客:NC59 矩阵的最小路径和

牛客&#xff1a;NC59 矩阵的最小路径和 文章目录 牛客&#xff1a;NC59 矩阵的最小路径和题目描述题解思路题解代码 题目描述 题解思路 动态规划&#xff0c;递推公式&#xff1a;matrix[i][j] min(matrix[i-1][j], matrix[i][j-1]) 题解代码 func minPathSum( matrix [][…

【数据科学赛】2023全球智能汽车AI挑战赛 #¥95000 #LLM文档问答 #视频理解

CompHub[1] 最新的比赛会第一时间在群里通知&#xff0c;欢迎加群交流比赛经验&#xff01;&#xff08;公众号回复“加群”即可&#xff09; 以下内容由AI辅助生成&#xff0c;可能存在错误&#xff0c;可进入比赛主页[2]查看更多(文末阅读原文) 比赛主办方 吉利汽车集团、阿…

【C++】:类和对象(中)之拷贝构造函数+赋值运算符重载

拷贝构造函数 概念 在现实生活中&#xff0c;可能存在一个与你一样的自己&#xff0c;我们称其为双胞胎 那在创建对象时&#xff0c;可否创建一个与已存在对象一某一样的新对象呢&#xff1f; 拷贝构造函数&#xff1a;只有单个形参&#xff0c;该形参是对本类类型对象的引用…

FPGA的斐波那契数列Fibonacci设计verilog,代码和视频

名称&#xff1a;斐波那契数列Fibonacci设计verilog 软件&#xff1a;Quartus 语言&#xff1a;Verilog 代码功能&#xff1a; 设计一个产生斐波那契数列&#xff08;也叫黄金分割数列&#xff09;的硬件电路: 斐波那契数列中每个数为其相邻前两个数的和:即FNFN1FN2,(数列…

Python:函数篇(每周练习)

编程题&#xff1a; Python第四章作业&#xff08;初级&#xff09; (educoder.net) 题一&#xff1a;无参无返回值函数 def print_hi_human(): # 函数名用小写字母print("人类&#xff0c;你好&#xff01;")if __name__ __main__:print_hi_human() 题二&#…

设计模式篇---组合模式

文章目录 概念结构实例总结 概念 组合模式&#xff1a;组合多个对象形成树形结构以表示具有部分-整体关系的层次结构。组合模式让客户端可以统一对待单个对象和组合对象。 当我们开发中遇到树形结构的业务时&#xff0c;可以考虑使用组合模式。&#xff08;我也没有想明白为啥…

Mysql数据库 2.SQL语言 数据类型与字段约束

Mysql数据类型 数据类型&#xff1a;指的是数据表中的列文件支持存放的数据类型 1.数值类型 Mysql当中有多种数据类型可以存放数值&#xff0c;不同的类型存放的数值的范围或者形式是不同的 注&#xff1a;前三种数字类型我们在实际研发中用的很少&#xff0c;一般整数类型…

空中计算(Over-the-Air Computation)学习笔记

文章目录 写在前面 写在前面 本文是论文A Survey on Over-the-Air Computation的阅读笔记&#xff1a; 通信和计算通常被视为独立的任务。 从工程的角度来看&#xff0c;这种方法是非常有效的&#xff0c;因为可以执行孤立的优化。 然而&#xff0c;对于许多面向计算的应用程序…

游戏反虚拟框架检测方案

游戏风险环境&#xff0c;是指独立于原有设备或破坏设备原有系统的环境。常见的游戏风险环境有&#xff1a;iOS越狱、安卓设备root、虚拟机、虚拟框架、云手机等。 因为这类风险环境可以为游戏外挂、破解提供所需的高级别设备权限&#xff0c;所以当游戏处于这些设备环境下&am…

ARM可用的可信固件项目简介

安全之安全(security)博客目录导读 目录 一、TrustedFirmware-A (TF-A) 二、MCUboot 三、TrustedFirmware-M (TF-M) 四、TF-RMM 五、OP-TEE 六、Mbed TLS 七、Hafnium 八、Trusted Services 九、Open CI 可信固件为Armv8-A、Armv9-A和Armv8-M提供了安全软件的参考实现…

【UE5】 ListView使用DataTable数据的蓝图方法

【UE5】 ListView使用DataTable数据的蓝图方法 ListView 是虚幻引擎中的一种用户界面控件&#xff0c;用于显示可滚动的列表。它可以用于显示大量的数据&#xff0c;并提供了各种功能和自定义选项来满足不同的需求。 DataTable是虚幻引擎中的一种数据表格结构&#xff0c;用于存…

Vue Router - 路由的使用、两种切换方式、两种传参方式、嵌套方式

目录 一、Vue Router 1.1、下载 1.2、基本使用 a&#xff09;引入 vue-router.js&#xff08;注意&#xff1a;要在 Vue.js 之后引入&#xff09;. b&#xff09;创建好路由规则 c&#xff09;注册到 Vue 实例中 d&#xff09;展示路由组件 1.3、切换路由的两种方式 1.…

ubuntu20.04 nvidia显卡驱动掉了,变成开源驱动,在软件与更新里选择专有驱动,下载出错,调整ubuntu镜像源之后成功修复

驱动配置好&#xff0c;环境隔了一段时间&#xff0c;打开Ubuntu发现装好的驱动又掉了&#xff0c;软件与更新 那里&#xff0c;附加驱动&#xff0c;显示开源驱动&#xff0c;命令行输入 nvidia-smi 命令查找不到驱动。 点击上面的 nvidia-driver-470&#xff08;专有&#x…

wps excel js编程

定义全局变量 const a "dota" function test() {Debug.Print(a) }获取表格中单元格内容 function test() {Debug.Print("第一行第二列",Cells(1,2).Text)Debug.Print("A1:",Range("A1").Text) }写单元格 Range("C1").Val…

【面试经典150 | 栈】有效的括号

文章目录 Tag题目来源题目解读解题思路方法一&#xff1a;栈哈希表 其他语言cpython3 写在最后 Tag 【栈】 题目来源 20. 有效的括号 题目解读 括号有三种类型&#xff0c;分别是小括号、中括号和大括号&#xff0c;每种括号的左右两半括号必须一一对应才是有效的括号&#…