深入理解 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…...

速盾:CDN缓存的工作原理是什么?
CDN(内容分发网络)是一种将内容分发到全球不同地理位置的网络架构,以提供更快速、可靠的内容传输。其核心原理是利用缓存技术,将数据内容分布到离用户最近的边缘节点上。当用户请求内容时,CDN将根据用户的IP地址&#…...

日常开发记录-正确的prop传参,reduce搭配promise的使用
日常开发记录-正确的prop传参,reduce搭配promise的使用 1.正确的prop传参2.reduce搭配promise的使用 1.正确的prop传参 一般会的父组件传参子组件 //父组件 <A :demodata.sync"testData" :listData.sync"testData2"></A> data ()…...

Hyper-V配置-cnblog
启用Hyper-V以在 Windows 10上创建虚拟机 (1)控制面板检查系统要求: 确保您的计算机符合 Hyper-V 的系统要求。通常情况下,您的计算机需要运行 Windows 10 专业版、企业版或教育版,并且具有启用了虚拟化技术的处理器。…...

运维Tips:Docker或K8s集群拉取Harbor私有容器镜像仓库配置指南
[ 知识是人生的灯塔,只有不断学习,才能照亮前行的道路 ] Docker与Kubernetes集群拉取Harbor私有容器镜像仓库配置 描述:在现在微服务、云原生的环境下,通常我们会在企业中部署Docker和Kubernetes集群,并且会在企业内部搭建Harbor私有镜像仓库以保证开发源码安全,以及加快…...

openssl颁发包含主题替代名的证书–SAN
原文地址:openssl颁发包含主题替代名的证书–SAN – 无敌牛 欢迎参观我的个人博客:无敌牛 – 技术/著作/典籍/分享等 在 X.509 证书中,commonName(CN)字段只能有一个值。如果让证书支持多个域名和IP地址,…...

Stable Diffusion入门教程
要入门Stable Diffusion,你可以按照以下步骤进行: 1. 安装Stable Diffusion 获取安装包:你可以从GitHub上的 Stable Diffusion Web UI开源地址获取安装包。 一键启动程序包:如果你是小白不会装,可以使用国内秋葉aaaki开…...

H.265流媒体播放器EasyPlayer.js无插件H5播放器关于移动端(H5)切换网络的时候,播放器会触发什么事件
EasyPlayer.js无插件H5播放器作为一款功能全面的H5流媒体播放器,凭借其多种协议支持、多种解码方式、丰富的渲染元素和强大的应用功能,以及出色的跨平台兼容性,为用户提供了高度定制化的选项和优化的播放体验。无论是视频直播还是点播&#x…...

conan2 c/c++包管理入门之--------------------------conanfile.py
书接上回,用过使用cmake去手动指定CMAKE_TOOLCHAINE_FILE和CMAKE_BUILD_TYPE太麻烦,有没有更简单的办法了,经过我的大量探索下终于发现,使用conan build和conanfile.py。大致原理是conan在构建时会自动调用conanfile.py里面定义数据和函数。举个例子: from conan import …...

DICOM图像深入解析:为何部分DR/CR图像默认显示为反色?
概述 在数字医学影像处理中,CR(Computed Radiography,计算机放射摄影)和DR(Digital Radiography,数字放射摄影)技术广泛应用于医疗影像获取与分析。然而,临床实践中常常遇到这样一个问题:部分CR/DR图像在默认打开时呈现为反色(即负片效果),需手动反色后才能正常阅片…...

重新定义社媒引流:AI社媒引流王如何为品牌赋能?
在社交媒体高度竞争的时代,引流已经不再是单纯追求流量的数字游戏,而是要找到“对的用户”,并与他们建立真实的连接。AI社媒引流王通过技术创新和智能策略,重新定义了社媒引流的方式,帮助品牌在精准触达和高效互动中脱…...