Mybatis的一级缓存

news2025/1/11 13:58:43

目录

  • 前置
  • 生效
    • 场景一
    • 场景二
  • 失效
    • 场景一
    • 场景二
    • 场景三
    • 场景四
    • 场景五


前置

什么是一级缓存: mybatis 默认开启一级缓存, SQLSession会话缓存, 每个SQLSession都会有各自的缓存
以下会演示一级缓存生效/失效的场景
项目地址: https://gitee.com/xmaxm/test-code/blob/master/chaim-cache/chaim-mybatis-cache/chaim-mybatis-cache-one/README.md

相关缓存文章

Mybatis的一级缓存
Mybatis的二级缓存 (默认方式)
Mybatis的二级缓存 (Redis方式)
Mybatis的二级缓存 (ehcache方式)


生效


场景一

测试一级缓存生效, 默认开启, 需要保证在同一个 SqlSession (可使用 @Transactional 保持其同一个会话)
使用mybatis plus方法

@Transactional
public void queryingLevelCache() {
    LambdaQueryWrapper<SysUser> queryWrapper = new LambdaQueryWrapper<>();
    queryWrapper.select(SysUser::getUsername, SysUser::getPhone, SysUser::getId);
    queryWrapper.last("limit 1");
    SysUser sysUsers = sysUserMapper.selectOne(queryWrapper);
    log.info("查询成功, 观察日志, id: {}", sysUsers.getId());

    SysUser user = sysUserMapper.selectOne(queryWrapper);
    log.info("查询成功, 观察日志, id: {}", user.getId());
}

在这里插入图片描述


场景二

测试一级缓存生效, 默认开启, 需要保证在同一个 SqlSession (可使用 @Transactional 保持其同一个会话)
使用自定义SQL

    @Transactional
    public void queryingLevelCache(Integer integer) {
        SysUser sysUsers = sysUserMapper.selectHandwritingSql();
        log.info("查询成功, 观察日志, id: {}", sysUsers.getId());

        SysUser user = sysUserMapper.selectHandwritingSql();
        log.info("查询成功, 观察日志, id: {}", user.getId());
    }

在这里插入图片描述


失效


场景一

测试一级缓存失效: 当两次查询存在之间, 存在增删改的情况

public void queryingLevelCacheFail() {
        LambdaQueryWrapper<SysUser> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.select(SysUser::getUsername, SysUser::getPhone, SysUser::getId);
        queryWrapper.last("limit 1");
        SysUser sysUsers = sysUserMapper.selectOne(queryWrapper);
        log.info("查询成功, 观察日志, id: {}", sysUsers.getId());

        SysUser sysUser = SysUser.builder()
                .username("潇潇")
                .email("gmail.com")
                .phone("000123")
                .password("123456")
                .sex(1)
                .state(0)
                .salt(1234)
                .build();
        sysUserMapper.insert(sysUser);
        log.info("观察新增日志, id: {}", sysUsers.getPassword());

        SysUser user = sysUserMapper.selectOne(queryWrapper);
        log.info("查询成功, 观察日志, id: {}", user.getId());
    }

在这里插入图片描述


场景二

测试一级缓存失效: 当两次查询的方式不一样, 使用mybatis的方法, 以及自定义SQL
同理, 当查询的条件以及查询的内容不一致时也会失效

 public void queryingLevelCacheFail(Integer integer) {
        LambdaQueryWrapper<SysUser> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.select(SysUser::getUsername, SysUser::getPhone);
        queryWrapper.last("limit 1");
        SysUser sysUsers = sysUserMapper.selectOne(queryWrapper);
        log.info("查询成功, 观察日志, id: {}", sysUsers.getId());

        SysUser user = sysUserMapper.selectHandwritingSql();
        log.info("查询成功, 观察日志, id: {}", user.getId());
    }

在这里插入图片描述


场景三

测试一级缓存失效: 手动清除缓存

@Override
public void queryingLevelCacheFail(String string) {
    SysUser sysUsers = sysUserMapper.selectHandwritingSql();
    log.info("查询成功, 观察日志, id: {}", sysUsers.getId());

    sqlSession.clearCache();

    SysUser user = sysUserMapper.selectHandwritingSql();
    log.info("查询成功, 观察日志, id: {}", user.getId());
}

在这里插入图片描述


场景四

测试一级缓存失效: 去除@Transactional, 使其不在同一个 SqlSession

@Override
public void queryingLevelCacheFail(Boolean blo) {
    SysUser sysUsers = sysUserMapper.selectHandwritingSql();
    log.info("查询成功, 观察日志, id: {}", sysUsers.getId());
    
    SysUser user = sysUserMapper.selectHandwritingSql();
    log.info("查询成功, 观察日志, id: {}", user.getId());
}

在这里插入图片描述


场景五

测试一级缓存失效:
xml配置: flushCache=“true”
注解方式SQL配置: @Options(flushCache = Options.FlushCachePolicy.TRUE)
同理还可以全局配置: 禁用mybatis一级缓存: mybatis-plus.configuration.local-cache-scope: statement. 默认开始 session

@Override
public void queryingLevelCacheFail(Long lon) {
    SysUser sysUsers = sysUserMapper.selectHandwritingSqlFail();
    log.info("查询成功, 观察日志, id: {}", sysUsers.getId());

    SysUser user = sysUserMapper.selectHandwritingSqlFail();
    log.info("查询成功, 观察日志, id: {}", user.getId());

    log.info("-----------自义定SQL的两种失效方式-----------------");

    sysUsers = sysUserMapper.selectHandwritingSqlFail2();
    log.info("查询成功, 观察日志, id: {}", sysUsers.getId());

    user = sysUserMapper.selectHandwritingSqlFail2();
    log.info("查询成功, 观察日志, id: {}", user.getId());
}
<select id="selectHandwritingSqlFail" resultType="com.chaim.mybatis.cache.one.entitys.SysUser" flushCache="true">
    SELECT username,phone,id FROM sys_user limit 1
</select>
@Options(flushCache = Options.FlushCachePolicy.TRUE)
@Select("SELECT username,phone,id FROM sys_user limit 1")
SysUser selectHandwritingSqlFail2();

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

初识golang微服务框架kratos

前言 今天给大家介绍一下Kratos&#xff0c;Kratos 一套轻量级 Go 微服务框架&#xff0c;包含大量微服务相关框架及工具,使用Kratos的原因主要是感觉原来使用的go-kit工具并不是很方便&#xff0c;期望用上kratos后开发会更快捷一些。 Kratos名字根据官方的説法是来源于:《战…

灵界的科学丨六、星际通信新科技──寻找外星人

摘自李嗣涔教授《灵界的科学》 外星先进文明科技领先地球的关键&#xff0c; 是外星人掌握了意识的物理&#xff0c; 能够制造仿照天眼的仪器&#xff0c; 自由进出虚数空间遨游宇宙&#xff0c;同时创造出瞬间科技。 人类未来学习的典范&#xff0c;就在天上无数的外星先进…

数据结构--线性表之顺序表

1.线性表定义 线性表&#xff08;List&#xff09;&#xff1a;零个或多个数据元素的有限序列。 线性表的数据集合为{a1,a2,…,an}&#xff0c;假设每个元素的类型均为DataType。其中&#xff0c;除第一个元素a1外&#xff0c;每一个元素有且只有一个直接前驱元素&#xff0c…

第三十三篇 transition-group 列表过渡

上一篇内容讲到的是transiotion&#xff0c;其中还记得有一个报错吗&#xff1f;如下&#xff1a; 先来回顾一下&#xff0c;<transition> 只能用于单个元素&#xff0c;如果在<transition>单中并列两个<p>标签&#xff0c;那么这样一来就会报以上这个错误&a…

六、表空间管理

六、表空间管理 1、查看表空间 使用DM Manager工具&#xff1a; 代码&#xff1a; -- 1、查看表空间名 select tablespace_name FROM SYS.DBA_TABLESPACES;-- 2、查看表空间名、表空间对应的数据文件地址、状态 select tablespace_name,file_name,status FROM dba_data_files;…

软件定义汽车产业生态创新白皮书

1 什么是软件定义汽车 1.1 驱动因素 汽车“新四化”的发展需要软件的加持 据大众汽车公开披露信息&#xff0c;未来平均每辆普通汽车软件代码量超 1 亿行。在电动化、智能化和网联化等的发展推动下&#xff0c;汽车将加速向高度数字化、信息化、智能化的移动终端发展。座舱娱…

CM311-1_YST_S905L3(B)_安卓9.0_设置无密码_默认打开adb_完美AI语音_线刷固件包

CM311-1_YST_S905L3(B)_安卓9.0_设置无密码_默认打开adb_完美AI语音_线刷固件包 固件特点&#xff1a; 1、修改dns&#xff0c;三网通用&#xff1b; 2、开放原厂固件屏蔽的市场安装和u盘安装apk&#xff1b; 3、无开机广告&#xff0c;无系统更新&#xff0c;不在被强制升…

LX12864P1屏幕使用介绍(ST7567驱动),显示横线、字符、图形

LX12864P1屏幕显示&#xff08;ST7567驱动&#xff09; 可编辑12864液晶模组&#xff0c;也就是液晶显示屏是有128*64个点阵组成。12864是一种图形点阵液晶显示器&#xff0c;它主要采用动态驱动原理由行驱动—控制器和列驱动器两部分组成了128(列)64(行)的全点阵液晶显示此显…

全国地级市城镇化和协调发展指数测算数据(2005-2019)六份数据

全国地级市城镇化和协调发展指数测算数据&#xff08;2005-2019&#xff09;六份数据 1、范围&#xff1a;受数据限制&#xff0c;剔除了新疆和西藏的城市共包括287个地级市 2、时间区间为&#xff1a;2005-2019年 3、六分数据包括&#xff1a; 地级市城镇化发展水平&#…

多线程入门

多线程简介 1. 进程/线程 # 进程 - 进程由指令和数据组成&#xff0c;指令要运行&#xff0c;数据要读写&#xff0c;必须将指令加载到CPU&#xff0c;数据加载到内存。指令运行过程中还需要用到磁盘&#xff0c;网络等IO设备 - 进程用来加载指令&#xff0c;管理内存&#x…

CentOS7 安装rabbitMQ步骤

全程使用root权限 1、修改主机名称 hostnamectl set-hostname rmq158 2、输入命令&#xff1a;vi /etc/hosts修改hosts文件 3、重启 4、WINSCP传输两个包到/usr/local下面 5、tar -xvf otp_src_21.3.tar.gz cd otp_src_21.3 ./configure --prefix/usr/local/erlang 6、yum i…

教学:制作 GitHub 同步近期博客卡片

这几天看到有小伙伴将自己近期更新的博客同步显示到了 GitHub 主页&#xff0c;这么有趣的小卡片我是一定要尝试一把的&#xff0c;完整的教程我已经整理好了&#xff0c;一起搞起来吧~ 2. 开始教程 2.1 实现流程&#xff1a; Github 的主页装修主要讲的就是主页的 Markdown 文…

Spring Security自定义验证码登录

本文内容来自王松老师的《深入浅出Spring Security》&#xff0c;自己在学习的时候为了加深理解顺手抄录的&#xff0c;有时候还会写一些自己的想法。 验证码登录也是项目中一个常见的需求&#xff0c;但是Spring Security并未提供自动化配置方案。所以需要开发者自行定义。这里…

Spring的创建和使用

1. 创建Spring项目 1.1 创建一个 Maven 项目 不需要使用任何模板, 点击下一步.注:所有的名称都不能包含中文.Maven仓库中的结构: 1.2 添加 Spring 框架支持 在Spring 的 配置文件 中添加依赖 spring-context: Spring的上下文spring-beans: 管理Spring对象(bean) <depende…

36、异常(Exception)

一、 引入: 不应该出现了一个不算致命的问题就导致整个系统崩溃&#xff0c;所以java设计者提供了一个异常处理机制来解决问题 快速入门&#xff1a; package exception_;public class Exception01 {public static void main(String[] args) {int num110;int num20;//异常处…

软件工程复习

文章目录&#xff08;一&#xff09;软件软件发展三阶段软件的概念什么是软件危机&#xff1f;内容包括&#xff1a;软件危机的表现&#xff1a;软件危机的原因(4)消除软件危机的途径&#xff1a;软件工程软件工程定义&#xff08;要背&#xff09;简称&#xff1a;软件工程的基…

【Java基础】第六章 | IO流

目录 | 总框架 | 文件路径相关知识 | Peoperties类与IO流、配置文件* | 1.文件流 文件字节输入流&#xff08;标准输入流&#xff09; FileInputStream 文件字节输出流 FileOutputStream 文件字符输入流 FileReader 文件字符输出流 FileWriter 应用&#xff1a;使用字…

MMDetection库中的一些模块介绍

本文目前仅包含1个主干网络和1个颈部网络。如果有机会&#xff0c;会继续补充更多模型。 若发现内容有误&#xff0c;欢迎指出。 MMDetection的图像数据一般会经历如下步骤/模块&#xff1a; #mermaid-svg-XxM18Ychr9OSpdV6 {font-family:"trebuchet ms",verdana,ari…

JavaScript 防抖与节流

目录1 函数1.1 调用函数1.2 闭包2 防抖与节流2.1 定义2.2 区别2.3 应用场景3 防抖3.1 非立即执行3.1.1 一般写法3.1.2 Vue2 中写法3.1.3 过程3.2 立即执行3.2.1 一般写法3.2.2 Vue2 中写法3.2.3 过程1 函数 应用防抖节流首先需理解以下知识 1.1 调用函数 js 函数内部 return…

电影售票系统

项目介绍 基于SpringBoot &#xff0c;Mybatis&#xff0c; Vue 的电影售票及影院管理系统&#xff08;前后端分离&#xff09;&#xff0c;具体功能见 下面演示截图 需要安装的软件 Java8 MySQL5.7或以上 Navicat或者其他管理工具 IDEA或者Eclipse Node.js 14或以上 运行项…