深入理解 MyBatis 的缓存机制:一级缓存与二级缓存
MyBatis 是目前 Java 开发中常用的一种 ORM(对象关系映射)框架,它不仅简化了 SQL 语句的编写和管理,还提供了强大的缓存机制,用以提高数据库访问的性能。MyBatis 的缓存分为一级缓存和二级缓存,分别应用于不同的层次和场景。在本文中,我们将深入探讨 MyBatis 的缓存机制,包括一级缓存、二级缓存的原理、工作机制及其在应用中的优势和注意事项。
目录
- 什么是 MyBatis 缓存?
- 一级缓存
- 一级缓存的实现原理
- 一级缓存的作用范围
- 二级缓存
- 二级缓存的实现原理
- 如何启用二级缓存
- 一级缓存与二级缓存的区别
- 缓存的作用与限制
- MyBatis 缓存最佳实践
- 小结
1. 什么是 MyBatis 缓存?
在应用程序开发中,数据库的查询通常是性能瓶颈之一。为了解决这一问题,MyBatis 提供了 缓存机制,将查询的结果保存到内存中,后续相同的查询可以直接从缓存中获取,从而减少对数据库的访问,提升系统性能。
MyBatis 的缓存机制分为两级:
- 一级缓存:作用范围是SqlSession,同一 SqlSession 内多次执行相同的查询会缓存结果。
- 二级缓存:作用范围是Mapper 映射级别,同一个 Mapper 对象的多次查询可以共享缓存数据。
2. 一级缓存
2.1 一级缓存的实现原理
MyBatis 的一级缓存是默认开启的,每个 SqlSession 都会有一个一级缓存。一级缓存的存储介质是 HashMap,它存储了由 SQL 语句和查询参数生成的缓存键值对,查询的结果会存储在 SqlSession 对象的缓存中。
例如,在一次查询中,当执行 SQL 语句时,MyBatis 会先检查缓存中是否存在该查询的结果,如果有则直接返回;如果没有,则执行查询并将结果缓存下来,供后续使用。
2.2 一级缓存的作用范围
一级缓存的作用范围是 SqlSession:
- 同一
SqlSession:在同一个SqlSession中,如果多次执行相同的查询(相同的 SQL 和参数),结果会从缓存中返回,避免了多次访问数据库。 - 不同的
SqlSession:不同的SqlSession对象之间不共享一级缓存,如果需要跨SqlSession共享缓存结果,则需要启用二级缓存。
一级缓存会在以下情况下失效:
- 执行
update、insert、delete等操作,修改了数据库中的数据。 - 执行了
SqlSession的clearCache()方法。 - 当前
SqlSession被关闭,一级缓存也随之被销毁。
3. 二级缓存
3.1 二级缓存的实现原理
二级缓存的作用范围是Mapper 映射级别,多个 SqlSession 可以共享同一个 Mapper 的二级缓存。它是通过将查询的结果持久化存储到内存中来实现的,通常使用 HashMap 或其他第三方缓存框架(如 EhCache、Redis)作为存储介质。
二级缓存需要手动开启,可以通过以下步骤启用:
- 在
mybatis-config.xml配置文件中开启全局的二级缓存支持:<settings><setting name="cacheEnabled" value="true"/> </settings> - 在需要启用二级缓存的 Mapper.xml 文件中添加
<cache/>标签:<mapper namespace="com.example.mapper.UserMapper"><cache/><!-- 其他的SQL映射 --> </mapper>
启用二级缓存后,查询的结果会存储在 Mapper 的缓存区域中,当其他 SqlSession 发起相同的查询时,MyBatis 会优先从缓存中获取数据。
3.2 如何启用二级缓存
以下是二级缓存的使用示例:
-
配置二级缓存:
在对应的Mapper.xml文件中,添加<cache/>标签,示例:<mapper namespace="com.example.mapper.UserMapper"><cache /><select id="getUserById" resultType="User">SELECT * FROM users WHERE id = #{id}</select> </mapper> -
二级缓存注意事项:
- 只有在
SqlSession被关闭后,查询的数据才会被保存到二级缓存。 - 二级缓存中的数据是全局共享的,不同
SqlSession都可以访问。 - 为了保证数据的一致性,
update、insert、delete等操作执行后,会清空相关的缓存数据。
- 只有在
4. 一级缓存与二级缓存的区别
-
缓存作用范围:
- 一级缓存:作用范围是
SqlSession,只在当前会话中有效。 - 二级缓存:作用范围是
Mapper级别,多个SqlSession可以共享。
- 一级缓存:作用范围是
-
生命周期:
- 一级缓存:随着
SqlSession的生命周期结束而结束。 - 二级缓存:在
SqlSession结束后,数据会存入持久化缓存中,并能被其他SqlSession共享。
- 一级缓存:随着
-
默认启用状态:
- 一级缓存:默认开启。
- 二级缓存:默认关闭,需要手动配置。
5. 缓存的作用与限制
5.1 缓存的作用
- 减少数据库访问:通过缓存查询结果,可以显著减少数据库的访问频率,从而提高系统性能。
- 提高数据访问速度:由于缓存的数据存储在内存中,读取速度比访问数据库要快得多。
5.2 缓存的限制
- 一致性问题:当数据库中的数据发生变化时,缓存中的数据可能会变得不一致,因此需要设置合适的缓存失效机制。
- 适用场景有限:缓存适合那些读多写少的场景,在频繁写操作的场景中,缓存的更新会带来额外的性能消耗。
6. MyBatis 缓存最佳实践
- 确保数据的一致性:在频繁写操作的场景中,不推荐启用缓存。缓存可以带来读性能的提升,但必须谨慎对待数据的一致性问题。
- 合理设置缓存策略:通过设置合适的失效时间和过期策略,可以在保证性能的同时避免缓存带来的数据不一致问题。
- 结合第三方缓存框架:可以使用 Redis、EhCache 等第三方缓存框架来增强二级缓存的性能和管理能力。
7. 小结
MyBatis 的缓存机制为开发者提供了有效提高查询效率的工具。一级缓存默认开启,作用范围是 SqlSession,而 二级缓存需要手动配置,作用范围是 Mapper。二级缓存使得不同的会话之间可以共享查询结果,进一步减少数据库访问频率。
在实际开发中,合理使用缓存机制可以显著提高应用的性能,但需要注意数据的一致性问题,特别是在涉及频繁的写操作时,使用缓存必须非常谨慎。通过结合不同的缓存策略和第三方缓存框架,开发者可以构建出更为高效和稳定的系统。
理解并应用 MyBatis 的缓存机制,能够帮助开发人员在数据访问的性能和数据一致性之间找到良好的平衡点,从而提高系统的整体性能。
相关文章:
深入理解 MyBatis 的缓存机制:一级缓存与二级缓存
MyBatis 是目前 Java 开发中常用的一种 ORM(对象关系映射)框架,它不仅简化了 SQL 语句的编写和管理,还提供了强大的缓存机制,用以提高数据库访问的性能。MyBatis 的缓存分为一级缓存和二级缓存,分别应用于不…...
移远通信推出全新5G RedCap模组RG255AA系列,以更高性价比加速5G轻量化大规模商用
11月20,全球领先的物联网整体解决方案供应商移远通信宣布,正式推出其全新5G RedCap模组RG255AA系列。该系列模组支持5G NR独立组网(SA)和LTE Cat 4双模通信,具有高性能高集成度、低功耗、小尺寸、高性价比等优势&#…...
架构-微服务-环境搭建
文章目录 前言一、案例准备1. 技术选型2. 模块设计3. 微服务调用 二、创建父工程三、创建基础模块四、创建用户微服务五、创建商品微服务六、创建订单微服务 前言 微服务环境搭建 使用的电商项目中的商品、订单、用户为案例进行讲解。 一、案例准备 1. 技术选型 maven&a…...
conda下载与pip下载的区别
一、conda下载与pip下载的区别 最重要是依赖关系: pip安装包时,尽管也对当前包的依赖做检查,但是并不保证当前环境的所有包的所有依赖关系都同时满足。 当某个环境所安装的包越来越多,产生冲突的可能性就越来越大。conda会检查当…...
MySQL获取数据库内所有表格数据总数
在 MySQL 中,要获取数据库内所有表格的数据总数,可以编写一个查询脚本来遍历每个表并计算其行数。你可以使用 INFORMATION_SCHEMA 数据库,它包含了关于数据库元数据的表格,如 TABLES 和 COLUMNS。 以下是一个示例脚本,…...
Matlab 深度学习工具箱 案例学习与测试————求二阶微分方程
clc clear% 定义输入变量 x linspace(0,2,10000);% 定义网络的层参数 inputSize 1; layers [featureInputLayer(inputSize,Normalization"none")fullyConnectedLayer(10)sigmoidLayerfullyConnectedLayer(1)sigmoidLayer]; % 创建网络 net dlnetwork(layers);% 训…...
django authentication 登录注册
文章目录 前言一、django配置二、后端实现1.新建app2.编写view3.配置路由 三、前端编写1、index.html2、register.html3、 login.html 总结 前言 之前,写了django制作简易登录系统,这次利用django内置的authentication功能实现注册、登录 提示ÿ…...
三种蓝牙架构实现方案
一、蓝牙架构方案 1、hostcontroller双芯片标准架构 手机里面包含很多SoC或者模块,每颗SoC或者模块都有自己独有的功能,比如手机应用跑在AP芯片上,显示屏,3G/4G通信,WiFi/蓝牙等都有自己专门的SoC或者模块࿰…...
ffmpeg 视频滤镜:高斯模糊-gblur
滤镜描述 gblur 官网地址 > FFmpeg Filters Documentation 这个滤镜会将视频变得模糊。 滤镜使用 参数 gblur AVOptions:sigma <float> ..FV.....T. set sigma (from 0 to 1024) (default 0.5)steps <int> ..FV.....T…...
期权懂|在期权市场中,如何用好双买期权?
期权小懂每日分享期权知识,帮助期权新手及时有效地掌握即市趋势与新资讯! 在期权市场中,如何用好双买期权? 期权双买操作,即同时买入认购期权(看涨期权)和认沽期权(看跌期权…...
【Linux学习】【Ubuntu入门】2-3 make工具和makefile引入
1.使用命令新建三个.c文件vi main.c,vi input.c,vi caclcu.c,两个.h文件vi input.h,vi caclcu.h 2.vi Makefile:新建Makefile文件,输入一下内容 注意:命令列表中每条命令前用TAB键,不…...
《黑神话:悟空》游戏辅助修改器工具下载指南与操作方法详解
《黑神话:悟空》是一款备受期待的动作冒险游戏,目前尚未正式发布。游戏开发团队一直在强调游戏的完整性和公平性,因此官方并不支持任何形式的作弊或修改行为。然而,对于一些玩家而言,使用辅助修改器可能会成为他们体验…...
C语言菜鸟入门·关键字·union的用法
目录 1. 简介 2. 访问成员 2.1 声明 2.2 赋值 3. 共用体的大小 4. 与typedef联合使用 5. 更多关键字 1. 简介 共用体(union)是一种数据结构,它允许在同一内存位置存储不同的数据类型,但每次只能存储其中一种类型的…...
ensp静态路由实验
一、实验目的 1、熟练掌握交换机的基本配置命令 2、熟练掌握静态路由的使用方法 3. 熟练掌握交换机端口模式 二、实验内容 需求: 根据要求利用现有实验设备组建小型局域网 实验设备: 交换机S37002台;PC机2台;路由器2台。 …...
构建 Java Web 应用程序:从 Servlet 到数据库交互(Eclipse使用JDBC连接Mysql数据库)
第 1 部分:环境设置 安装 Java Development Kit (JDK):下载并安装 JDK。设置 IDE:安装并配置 IDE(如 IntelliJ IDEA 或 Eclipse)。安装数据库:下载并安装 MySQL 数据库。配置数据库:创建数据库…...
mfc100u.dll是什么?分享几种mfc100u.dll丢失的解决方法
mfc100u.dll 是一个动态链接库(DLL)文件,属于 Microsoft Foundation Classes (MFC) 库的一部分。MFC 是微软公司开发的一套用于快速开发 Windows 应用程序的 C 类库。mfc100u.dll 文件包含了 MFC 库中一些常用的函数和类的定义,这…...
Java面试之多线程并发篇
前言 本来想着给自己放松一下,刷刷博客,突然被几道面试题难倒!说一说自己对于 synchronized 关键字的了解?说说自己是怎么使用 synchronized 关键字?什么是线程安全?Vector是一个线程安全类吗?…...
视频推拉流EasyDSS互联网直播点播平台技术特点及应用场景剖析
在数字科技日新月异的今天,视频直播和点播已经成为互联网内容传播的重要方式之一。而互联网直播点播平台EasyDSS作为功能强大的流媒体直播点播视频能力平台,提供了一站式的视频推拉流、转码、直播、点播、时移回放、存储等视频服务,广泛应用于…...
安全加固方案
交换机安全加固 查看是否关闭未使用的接口 25GE1/0/1、25GE1/0/47、25GE1/0/48需要使用,暂不关闭 system-view # interface Eth-Trunk99 shutdown quit interface Eth-Trunk100 shutdown quit interface Eth-Trunk110 shutdown quit interface 25GE1/…...
Linux firewall防火墙规则
官网 https://firewalld.org/ 查看所有防火墙规则: firewall-cmd --list-all-zones查看当前区域防火墙规则: firewall-cmd --list-all添加一个开放服务规则: firewall-cmd --add-servicessh删除一个开放服务规则: firewall-cmd…...
【JavaEE】-- HTTP
1. HTTP是什么? HTTP(全称为"超文本传输协议")是一种应用非常广泛的应用层协议,HTTP是基于TCP协议的一种应用层协议。 应用层协议:是计算机网络协议栈中最高层的协议,它定义了运行在不同主机上…...
3.3.1_1 检错编码(奇偶校验码)
从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序
一、开发准备 环境搭建: 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 项目创建: File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...
#Uniapp篇:chrome调试unapp适配
chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器:Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...
GitFlow 工作模式(详解)
今天再学项目的过程中遇到使用gitflow模式管理代码,因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存,无论是github还是gittee,都是一种基于git去保存代码的形式,这样保存代码…...
Python训练营-Day26-函数专题1:函数定义与参数
题目1:计算圆的面积 任务: 编写一个名为 calculate_circle_area 的函数,该函数接收圆的半径 radius 作为参数,并返回圆的面积。圆的面积 π * radius (可以使用 math.pi 作为 π 的值)要求:函数接收一个位置参数 radi…...
C#最佳实践:为何优先使用as或is而非强制转换
C#最佳实践:为何优先使用as或is而非强制转换 在 C# 的编程世界里,类型转换是我们经常会遇到的操作。就像在现实生活中,我们可能需要把不同形状的物品重新整理归类一样,在代码里,我们也常常需要将一个数据类型转换为另…...
linux设备重启后时间与网络时间不同步怎么解决?
linux设备重启后时间与网络时间不同步怎么解决? 设备只要一重启,时间又错了/偏了,明明刚刚对时还是对的! 这在物联网、嵌入式开发环境特别常见,尤其是开发板、树莓派、rk3588 这类设备。 解决方法: 加硬件…...
