一级缓存和二级缓存问题

news2024/11/13 15:26:48

介绍

MyBatis 中的缓存,主要分为一级缓存和二级缓存。

一级缓存是 SqlSession 级别的缓存,也叫本地缓存。当执行一个 SqlSession 的查询时,查询到的结果会被保存在 SqlSession 的缓存中。同一个 SqlSession 内执行相同的 SQL 语句,则会从缓存中获取数据,而不会再向数据库发出请求。一级缓存默认开启,不需要手动配置。

二级缓存是 Mapper 级别的缓存,也叫全局缓存。多个 SqlSession 共享一块缓存区域,从而减少了对数据库的访问次数。需要手动配置开启,在 Mapper.xml 文件中添加 <cache> 标签即可。

一般情况下,我们优先考虑使用一级缓存,因为它是自动开启的,可以避免一些可能的问题。如果在具体的场景中需要使用到二级缓存,可以单独配置。

需要注意的是,二级缓存虽然可以提升性能,但也带来了一些问题。如缓存的数据和数据库中的数据不一致等问题,因此在使用二级缓存时,需要谨慎处理缓存与数据库之间的数据同步问题。

如何关闭一次缓存,并开启二级缓存

Mybatis是Java语言中一种流行的持久化框架,主要用于关系型数据库操作。该框架通过映射配置文件将Java类映射到相应的数据库表中,并提供了一系列SQL执行的方法和优化机制。其中,flushCache和useCache是两个常见的缓存控制选项。

flushCache

flushCache是Mybatis提供的一个属性,当为true时,它会把该条SQL语句所在的缓存清除,这样可以在下次查询时不从缓存中读取,直接重新执行SQL语句查询数据库。

例如:

<select id="getUserById" parameterType="int" resultType="com.example.User" flushCache="true">
  select * from user where id = #{id}
</select>

上述示例,使用flushCache="true"代表需要刷新缓存,在每次调用getUserById查询语句时都会清空缓存从而重新执行SQL查询。

useCache

useCache是Mybatis提供的另一个属性,表示是否使用二级缓存,默认值为true。开启该属性后,Mybatis会先检查是否有缓存可用,如果有,则直接返回结果,否则才会执行SQL语句。

例如:

<select id="getUserById" parameterType="int" resultType="com.example.User" useCache="true">
  select * from user where id = #{id}
</select>

上述示例,使用useCache="true"声明需要使用二级缓存,在每次调用getUserById查询时,先从缓存中获取数据,如果没有命中再去查询数据库,查到数据之后会将其放入缓存。注意该特性只对一级缓存有效,如果要使用二级缓存,需配置相应的cache标签。

案例

查询代码测试

    @Test
    public void query(){
        SqlSession sqlSession= MyUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        User user1 = mapper.getById(1);
        System.out.println(user1);
        System.out.println("======================");
        User user2 = mapper.getById(1);
        System.out.println(user2);
        sqlSession.close();
    }

下面结果可以解释一级缓存默认开启,查询只查了一次

如果关闭了一级缓存,就需要查询两次,如图:

缓存失效的情况:

  • 查询不同的语句
  • 增删改操作,可能会改变原来的数据,所以必定会刷新缓存
  • 手动清理缓存

 查询和插入代码测试

    @Test
    public void query(){
        SqlSession sqlSession= MyUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        User user1 = mapper.getById(1);
        int i = mapper.addUser(new User(9, "jdasi", "21423"));
        if(i>0){
            System.out.println("插入成功");
        }
        System.out.println("======================");
        System.out.println(user1);
        sqlSession.close();
    }

当分别执行查询和插入,执行两次,此时缓存失效

如果需要开启二级缓存,在sql映射文件添加

<cache/>

如图:

如果遇到下面的问题

在需要在实体类实现一个序列化接口即可

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

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

相关文章

C语言CRC-16 CCITT-FALSE格式校验函数

C语言CRC-16 CCITT-FALSE格式校验函数 CRC-16校验产生2个字节长度的数据校验码&#xff0c;通过计算得到的校验码和获得的校验码比较&#xff0c;用于验证获得的数据的正确性。基本的CRC-16校验算法实现&#xff0c;参考&#xff1a; C语言标准CRC-16校验函数。 不同应用规范…

【MySQL】浅谈事务

哈喽&#xff0c;大家好~我是你们的老朋友&#xff1a;保护小周ღ 谈起 “事务”&#xff0c;可能大家都会在心中出现一个大大的 &#xff1f;&#xff0c;博主的理解——事务就是解决 MySql数据库在应对多线程环境下针对同一存储空间的数据修改引起的数据安全问题的一种机制…

JMeter入门配置

目录 场景&#xff1a; 环境及工具 &#xff1a; JMeter中文配置&#xff1a; 配置登录接口&#xff1a; 配置响应结果&#xff1a; 配置json提取器 测试json提取器 配置Beanshell后置处理器&#xff1a; http请求右键-->添加---->后置处理器--->Beanshell后置处理…

pta(浙大第四版)五道经典练习题②

目录 ①、递归正序输出整数 ②、递归逆序整数并返回 ③、递归实现十进制转二进制 ④、英语单词排序&#xff08;​编辑&#xff09; ⑤、输出月份英文名 ①、递归正序输出整数 题述&#xff1a;给一个正整数n&#xff0c;请利用递归按顺序输出它的每位数&#xff0c;输出一…

【NovelAI 小说SD批量生成 文生图/视频克隆】环境配置和使用方法

【样品】《谜影之夜》文生图全自动版SD一键成片 操作步骤&环境配置地址&#xff1a; 【NovelAI】月产10000全自动批量原创小说短视频支持文生图和视频克隆 该文章面向购买脚本的付费用户&#xff0c;提供所有问题以及解决办法。使用 notepad 打开对应的文件即可&#xff0c…

深度学习部署(Pytorch+windows)

目录 NVIDA GPU驱动 NVIDA GPU驱动 查看电脑显卡类型&#xff08;电脑——属性——设备管理器——显示适配器&#xff09; 进入NVIDA官方网站&#xff08;官方驱动 | NVIDIA&#xff09;下载对应驱动&#xff0c; 接下来默认安装即可。 安装完成之后&#xff0c;查看自己的…

GitHub项目免费教你提示工程,全中文教学,小白也能懂

转载自 | 量子位 量子位 | 公众号 QbitAI 这个GitHub开源项目&#xff0c;打算手把手教你成为一名提示工程师。 理论与实例结合&#xff0c;浅显易懂&#xff0c;可以免费学习&#xff0c;关键还是中文&#xff01; 如果觉得GitHub界面看起来不方便&#xff0c;还可以到搭建…

文心领航走进大模型时代,从Q1财报看百度价值重估机遇

大模型风头不减&#xff0c;真正的“灵魂选手”在此刻交出了一季度成绩单&#xff0c;让市场看到了“AI巨头”的本色。 北京时间5月16日美股盘前&#xff0c;百度发布了2023Q1财报。财报显示&#xff0c;其营收和利润双双超市场预期&#xff0c;整体经营质量大幅度提高。在经济…

基于卷积的图像分类识别(四):GoogLeNet (V1~V4 Xception)

本专栏介绍基于深度学习进行图像识别的经典和前沿模型&#xff0c;将持续更新&#xff0c;包括不仅限于&#xff1a;AlexNet&#xff0c; ZFNet&#xff0c;VGG&#xff0c;GoogLeNet&#xff0c;ResNet&#xff0c;DenseNet&#xff0c;SENet&#xff0c;MobileNet&#xff0c…

JavaWeb学习-MyBatis-入门

JavaWeb学习-MyBatis-入门 快速入门准备工作配置Mybatis(数据库连接)编写程序mappertest 配置SQL提示JDBC介绍概述案例 数据库连接池概述连接池切换Druid连接池 lombok工具介绍maven坐标案例 来源 快速入门 准备工作 创建SpringBoot工程 数据库表usercreate table user (id …

flume 进阶 自定义source(十)

需求 每隔五秒输出5次数据 pom文件 <dependencies><dependency><groupId>org.apache.flume</groupId><artifactId>flume-ng-core</artifactId><version>1.9.0</version></dependency></dependencies>代码 pac…

NETALAND惊艳上线,平行云助力元宇宙大玩家网易闪亮登场

近日&#xff0c;网易传媒旗下全新的泛娱乐体验空间NETALAND惊艳上线。NETALAND以其近乎于电影质感的场景&#xff0c;趣味的互动模式&#xff0c;流畅、沉浸的交互体验&#xff0c;给营销行业带来了一份新答卷。 NETALAND整合了网易传媒强大的元宇宙技术和丰富的内容生态&…

【Jenkins】新手安装、运行Jenkins(详细教学)

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化 &#x1f449;专__注&#x1f448;&#xff1a;专注主流机器人、人工智能等相关领域的开发、…

【c语言】Union共用体

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c语言系列专栏&#xff1a;c语言之路重点知识整合 &#x…

如何将 O2OA 集成到企业微信实现微信办公

O2OA 平台拥有配套的原生开发的安卓和 IOS 移动 APP&#xff0c;可以以自建应用的方式集成到企业微信&#xff0c;同步企业微信的企业通讯录作为本地组织人员架构&#xff0c;并且可以将待办等通知直接推送到企业微信进行消息提醒。本篇主要介绍如何将 O2OA 集成到企业微信实现…

4年外包出来人废了,5次面试全挂....

我的情况 大概介绍一下个人情况&#xff0c;男&#xff0c;毕业于普通二本院校非计算机专业&#xff0c;18年跨专业入行测试&#xff0c;第一份工作在湖南某软件公司&#xff0c;做了接近4年的外包测试工程师&#xff0c;今年年初&#xff0c;感觉自己不能够再这样下去了&…

开心档之Java 抽象类

Java 抽象类 目录 Java 抽象类 抽象类 Employee.java 文件代码&#xff1a; AbstractDemo.java 文件代码&#xff1a; 继承抽象类 Salary.java 文件代码&#xff1a; AbstractDemo.java 文件代码&#xff1a; 抽象方法 Salary.java 文件代码&#xff1a; 抽象类总结…

2023海外网红营销策略揭秘:打造品牌曝光的7大技巧

随着全球互联网的普及&#xff0c;海外网红营销成为越来越多出海品牌的首选策略之一。然而&#xff0c;要在海外市场成功打造品牌形象并吸引目标受众并不容易。本文Nox聚星将详细介绍几项关键技巧&#xff0c;帮助您在海外市场中成功实施网红营销。 一、深入了解目标市场 在海…

如何避免软件bug?优化你的测试流程和设计用例方法就对啦!

目录 引言 一、测试流程 二、测试用例设计方法 等价类 边界值 场景设计法 判定表 错误推测法 结语 引言 对于大多数软件开发者和测试人员而言&#xff0c;避免出现bug是一项非常重要的任务。但是&#xff0c;在实际的开发过程中&#xff0c;我们经常容易忽略一些细节…

【Spring Boot】Spring Boot配置文件与Spring Boot日志文件

文章目录 1. 什么是Spring Boot&#xff1f;2. 如何创建Spring Boot项目&#xff1f;3. 验证Spring Boot项目的创建3.1 补充添加依赖3.2 代码示例 4. Spring Boot配置文件4.1 配置文件的作用4.2 配置文件的格式4.2.1 properties的语法4.2.2 yml的语法4.2.3 properties与yml的对…