MyBatis一级缓存和二级缓存

介绍

在开发基于 MyBatis 的应用时,缓存是提升性能的关键因素之一。MyBatis 提供了一级缓存和二级缓存,合理使用它们可以显著减少数据库的访问次数,提高系统的响应速度和吞吐量。本文将深入探讨 MyBatis 一级缓存和二级缓存的工作原理、使用方式以及注意事项。

一级缓存

概念

一级缓存是 MyBatis 中最基本的缓存,它是基于 SqlSession 的。也就是说,在同一个 SqlSession 中,执行相同的 SQL 查询时,MyBatis 会优先从一级缓存中获取数据,而不是再次访问数据库。

工作原理

当执行一个查询语句时,MyBatis 会先根据 SQL 语句和参数生成一个唯一的缓存键,然后检查一级缓存中是否存在该缓存键对应的数据。如果存在,则直接返回缓存中的数据;如果不存在,则执行 SQL 查询,并将查询结果存入一级缓存中,以便后续使用。

缓存失效情况

  • SqlSession 关闭:当 SqlSession 关闭时,一级缓存会被清空。
  • 执行增删改操作:在同一个 SqlSession 中执行增删改操作后,一级缓存会被清空,以确保数据的一致性。

二级缓存

概念

二级缓存是基于 SqlSessionFactory 的,它的作用范围更广。多个 SqlSession 可以共享二级缓存,只要它们是由同一个 SqlSessionFactory 创建的。

工作原理

二级缓存的工作原理与一级缓存类似,但它的生命周期更长。当一个 SqlSession 执行查询时,如果二级缓存中存在该查询结果,则直接返回;如果不存在,则执行查询,并将结果存入二级缓存中。

配置和使用

1. 开启二级缓存

在 mybatis-config.xml 中添加以下配置:

<settings><setting name="cacheEnabled" value="true"/>
</settings>

 

2. 在映射文件中启用缓存

在 UserMapper.xml 中添加 <cache> 标签:

<mapper namespace="com.example.UserMapper"><cache/><select id="selectUserById" parameterType="int" resultType="com.example.User">SELECT * FROM users WHERE id = #{id}</select>
</mapper>

 

缓存失效情况

  • 执行增删改操作:在任何 SqlSession 中执行增删改操作后,二级缓存中相关的数据会被清空,以确保数据的一致性。

一级缓存与二级缓存的比较

比较项一级缓存二级缓存
作用范围同一个 SqlSession同一个 SqlSessionFactory 下的所有 SqlSession
生命周期与 SqlSession 相同与 SqlSessionFactory 相同
数据共享不共享共享
缓存清空时机SqlSession 关闭或执行增删改操作执行增删改操作

注意事项

  • 数据一致性:由于缓存的存在,可能会导致数据不一致的问题。在使用缓存时,需要确保在数据发生变化时及时清空缓存。
  • 缓存大小:需要合理设置缓存的大小,避免缓存占用过多的内存。
  • 序列化:二级缓存中的对象需要实现 Serializable 接口,因为缓存可能会将对象序列化后存储。

总结

MyBatis 的一级缓存和二级缓存是提升应用性能的重要手段。一级缓存适用于在同一个 SqlSession 中多次执行相同查询的场景,而二级缓存适用于多个 SqlSession 共享数据的场景。在使用时,需要根据具体的业务需求和数据特点,合理配置和使用缓存,以确保数据的一致性和系统的性能。

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

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

相关文章

C++核心语法快速整理

前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 本文主要为学过多门语言玩家快速入门C 没有基础的就放弃吧。 全部都是精华&#xff0c;看完能直接上手改别人的项目。 输出内容 std::代表了这里的cout使用的标准库&#xff0c;避免不同库中的相同命名导致混乱 …

如何让自动驾驶汽车“看清”世界?坐标映射与数据融合概述

在自动驾驶领域,多传感器融合技术是实现车辆环境感知和决策控制的关键。其中,坐标系映射和对应是多传感器融合的重要环节,它涉及到不同传感器数据在统一坐标系下的转换和匹配,以实现对车辆周围环境的准确感知。本文将介绍多传感器融合中坐标系映射和对应的数学基础和实际应…

Unity Shader 的编程流程和结构

Unity Shader 的编程流程和结构 Unity Shader 的编程主要由以下三个核心部分组成&#xff1a;Properties&#xff08;属性&#xff09;、SubShader&#xff08;子着色器&#xff09; 和 Fallback&#xff08;回退&#xff09;。下面是它们的具体作用和结构&#xff1a; 1. Pr…

第十四天- 排序

一、排序的基本概念 排序是计算机科学中一项重要的操作&#xff0c;它将一组数据元素按照特定的顺序&#xff08;如升序或降序&#xff09;重新排列。排序算法的性能通常通过时间复杂度和空间复杂度来衡量。在 Python 中&#xff0c;有内置的排序函数&#xff0c;同时也可以手…

移除idea External Liraries 中maven依赖包

问题背景 扩展包里面不停的出现已经在POM文件注释的包&#xff0c;其实是没有查询到根源位置。 在IDEA插件中搜索Maven Helper 点击pom.xml文件 会出现扩展插件 定位之后在pom中添加exclusions&#xff0c;如下代码 <dependency><groupId>com.disney.eva.framewo…

AI革命!蓝耘携手海螺AI视频,打造智能化视频新纪元

AI革命&#xff01;蓝耘携手海螺AI视频&#xff0c;打造智能化视频新纪元 前言 在这个信息爆炸的时代&#xff0c;视频已经成为我们获取信息、学习新知识的重要方式。而随着人工智能&#xff08;AI&#xff09;技术的快速发展&#xff0c;AI与视频内容的结合为我们带来了全新的…

dify1.1.1安装

1、 按照GitHub上操作 下载源码&#xff0c;没有安装git的&#xff0c;可以下载成zip包&#xff0c; unzip 解压 git clone https://github.com/langgenius/dify.git cd dify cd docker cp .env.example .env2、启动前 &#xff0c;先改下 docker-compose.yaml&#xff0c;…

ElasticSearch 可观测性最佳实践

ElasticSearch 概述 ElasticSearch 是一个开源的高扩展的分布式全文检索引擎&#xff0c;它可以近乎实时的存储、检索数据&#xff1b;本身扩展性很好&#xff0c;可以扩展到上百台服务器&#xff0c;处理 PB 级别&#xff08;大数据时代&#xff09;的数据。ES 也使用 Java 开…

Excel处理控件Spire.XLS系列教程:C# 在 Excel 中添加或删除单元格边框

单元格边框是指在单元格或单元格区域周围添加的线条。它们可用于不同的目的&#xff0c;如分隔工作表中的部分、吸引读者注意重要的单元格或使工作表看起来更美观。本文将介绍如何使用 Spire.XLS for .NET 在 C# 中添加或删除 Excel 单元格边框。 安装 Spire.XLS for .NET E-…

前端Wind CSS面试题及参考答案

目录 标准盒模型与 IE 盒模型的区别是什么?如何通过 box-sizing 属性切换这两种盒模型? 如何计算一个元素在标准盒模型下的总宽度(包含 margin、padding、border)? 父元素高度塌陷的原因是什么?请列举至少 3 种清除浮动的方法。 方法一:使用 clear 属性 方法二:使用…

基于 ECharts 实现动态图表渲染支持10万+数据点实时更新方案

引言 实现支持10万数据点实时更新的动态图表渲染确实具有挑战性&#xff0c;尤其是在性能和用户体验方面。以下是一些关键点和应用场景&#xff1a; 关键挑战 性能优化&#xff1a; 渲染性能&#xff1a;大量数据点会导致浏览器渲染压力大&#xff0c;可能引发卡顿。数据处理…

装饰器模式 (Decorator Pattern)

装饰器模式 (Decorator Pattern) 是一种结构型设计模式,它动态地给一个对象添加一些额外的职责,就增加功能来说,装饰器模式相比生成子类更为灵活。 一、基础 1 意图 动态地给一个对象添加一些额外的职责。 就增加功能来说,装饰器模式相比生成子类更为灵活。 2 适用场景 当…

【Java】TCP网络编程:从可靠传输到Socket实战

活动发起人小虚竹 想对你说&#xff1a; 这是一个以写作博客为目的的创作活动&#xff0c;旨在鼓励大学生博主们挖掘自己的创作潜能&#xff0c;展现自己的写作才华。如果你是一位热爱写作的、想要展现自己创作才华的小伙伴&#xff0c;那么&#xff0c;快来参加吧&#xff01…

蓝桥杯C++基础算法-0-1背包

这段代码实现了一个经典的0-1 背包问题的动态规划解法。0-1 背包问题是指给定一组物品&#xff0c;每个物品有其体积和价值&#xff0c;要求在不超过背包容量的情况下&#xff0c;选择物品使得总价值最大。以下是代码的详细思路解析&#xff1a; 1. 问题背景 给定 n 个物品&am…

html5炫酷的科技感3D文字效果实现详解

炫酷的科技感3D文字效果实现详解 这里写目录标题 炫酷的科技感3D文字效果实现详解项目概述核心技术实现1. 3D文字效果2. 故障艺术效果&#xff08;Glitch Effect&#xff09;3. 动态网格背景4. 扫描线效果5. 粒子效果 性能优化考虑技术难点与解决方案项目总结扩展优化方向 项目…

车道保持中车道线识别

需要让小车保持车道行驶&#xff0c;首先需要进行车道线识别。 也可参看论文&#xff08;上传到资源里&#xff09;&#xff1a;自动驾驶汽车车道检测与预测的技术解析-基于图像处理和Hough变换的方法 1 车道识别流程 想进行车道线识别&#xff0c;并且希望在图像中选择一个特…

英伟达有哪些支持AI绘画的 工程

英伟达在AI绘画领域布局广泛&#xff0c;其自研工具与第三方合作项目共同构建了完整的技术生态。以下是其核心支持AI绘画的工程及合作项目的详细介绍&#xff1a; 一、英伟达自研AI绘画工具 1. GauGAN系列 技术特点&#xff1a;基于生成对抗网络&#xff08;GAN&#xff09;&…

驱动开发的引入

1.引入 Linux内核的整体架构本就非常庞大&#xff0c;其包含的组件也非常多。而我们怎样把需要的部分都包含在内核中呢? 一种方法是把所有需要的功能都编译到Linux内核中。这会导致两个问题&#xff0c;一是生成的内核会很大&#xff0c;二是如果我们要在现有的内核中新增或删…

AI日报 - 2025年3月24日

&#x1f31f; 今日概览&#xff08;60秒速览&#xff09; ▎&#x1f916; AGI突破 | Lyra生物序列建模架构效率惊人 在100生物任务中达最优&#xff0c;推理速度提升高达12万倍 ▎&#x1f4bc; 商业动向 | OpenAI用户破4亿&#xff0c;Meta与Reliance探讨AI合作 生态扩展与全…

VMware上对CentOS7虚拟机进行磁盘扩容、缩容

在VMware 17 Pro上对CentOS 7虚拟机进行磁盘扩容&#xff0c;同时保证原先部署的软件正常使用&#xff0c;可以按照以下步骤进行操作&#xff1a; 一、扩容 步骤一&#xff1a;关闭虚拟机并在VMware中扩展磁盘容量 关闭虚拟机&#xff1a;在VMware Workstation 17 Pro中&…