MyBatis 的一级、二级缓存

文章目录

    • 1️⃣ 一级缓存(Local Cache)
      • 📌 定义
      • 🚀 示例代码
    • 2️⃣ 二级缓存(Global Cache)
      • 📌 定义
      • 🚀 使用方式
    • 3️⃣ 一级缓存 vs. 二级缓存 📊
    • 4️⃣ 数据共享问题
      • 🔸 数据一致性问题
      • 🔸 并发访问问题
      • 🔸 分布式环境中的缓存共享
    • 5️⃣ 总结 🚀

MyBatis 提供了强大的缓存机制,以提高数据库查询性能。缓存主要分为 一级缓存二级缓存,它们分别应用于不同的范围和场景。

1️⃣ 一级缓存(Local Cache)

📌 定义

  • 作用范围:SqlSession 级别
  • 存储位置:SqlSession 内存中
  • 默认开启
  • 失效条件:
    • SqlSession 关闭
    • 执行 insertupdatedelete 操作
    • 执行 select 时手动刷新缓存 sqlSession.clearCache()
    • 查询不同的 SQL 语句

🚀 示例代码

SqlSession sqlSession1 = sqlSessionFactory.openSession();
UserMapper mapper1 = sqlSession1.getMapper(UserMapper.class);
User user1 = mapper1.getUserById(1); // 第一次查询,数据从数据库加载
User user2 = mapper1.getUserById(1); // 第二次查询,数据从缓存获取
sqlSession1.close();

2️⃣ 二级缓存(Global Cache)

📌 定义

  • 作用范围:Mapper(Namespace)级别,多 SqlSession 共享
  • 存储位置:MyBatis 全局级别缓存,通常存储在 PerpetualCache
  • 默认关闭,需要手动开启
  • 失效条件
    • 执行 insertupdatedelete 操作后,缓存会自动清除
    • 直接操作数据库

🚀 使用方式

  1. 开启二级缓存(在 mybatis-config.xmlmapper.xml 中设置):
<settings><setting name="cacheEnabled" value="true"/>
</settings>
  1. 在 Mapper 配置中启用缓存
<cache eviction="LRU" flushInterval="60000" size="512" readOnly="true"/>
  • eviction="LRU":最近最少使用的缓存清理策略
  • flushInterval="60000":60 秒自动刷新缓存
  • size="512":最大缓存 512 个对象
  • readOnly="true":只读,提高并发效率
  1. 示例代码
SqlSession sqlSession1 = sqlSessionFactory.openSession();
UserMapper mapper1 = sqlSession1.getMapper(UserMapper.class);
User user1 = mapper1.getUserById(1);
sqlSession1.close(); // 数据写入二级缓存SqlSession sqlSession2 = sqlSessionFactory.openSession();
UserMapper mapper2 = sqlSession2.getMapper(UserMapper.class);
User user2 = mapper2.getUserById(1); // 从二级缓存读取数据
sqlSession2.close();

3️⃣ 一级缓存 vs. 二级缓存 📊

对比项一级缓存二级缓存
作用范围SqlSessionMapper(Namespace)级别,多 SqlSession 共享
默认开启✅ 是❌ 否(需手动开启)
失效条件SqlSession 关闭、增删改操作增删改操作、数据库更新、缓存超时
适用场景单个会话内查询优化适用于多个 SqlSession 共享数据

4️⃣ 数据共享问题

二级缓存的主要作用之一是跨 SqlSession 共享数据,但也会引发一些问题:

🔸 数据一致性问题

  • 由于二级缓存存储在 Mapper 级别,数据修改后不会立即更新缓存,可能导致数据不一致。
  • 解决方案:
    • 使用事务控制,确保数据库更新后及时刷新缓存。
    • 定期刷新缓存,通过 flushInterval 机制自动更新。
    • 禁用二级缓存,对于高实时性数据建议不使用。

🔸 并发访问问题

  • 默认情况下,MyBatis 二级缓存是 readOnly,多个线程访问时不会有并发问题。
  • 如果设置 readOnly="false",则需要考虑线程安全问题。

🔸 分布式环境中的缓存共享

  • 单机应用:二级缓存可以有效减少数据库访问,提高性能。
  • 分布式应用:多个服务实例可能无法共享 MyBatis 二级缓存,导致缓存失效或不一致。
  • 解决方案:
    • 采用 Redis、EhCache 等第三方分布式缓存代替 MyBatis 内置缓存。
    • 结合 消息队列(MQ) 机制,在数据更新时广播清除缓存。

5️⃣ 总结 🚀

一级缓存 适用于 单个 SqlSession,默认开启,生命周期短。

二级缓存 适用于 多个 SqlSession 共享,默认关闭,需要手动开启。

数据一致性问题 是二级缓存的关键挑战,需谨慎使用。

分布式架构下建议使用第三方缓存(如 Redis)以实现缓存共享。

✅ 适用于 读多写少 的场景,如查询热门数据、字典数据等。

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

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

相关文章

软件性能测试与功能测试联系和区别

随着软件开发技术的迅猛发展&#xff0c;软件性能测试和功能测试成为了确保软件质量的两个重要环节。那么只有一字之差的性能测试和功能测试分别是什么?又有哪些联系和区别呢? 一、软件性能测试是什么?   软件性能测试是为了评估软件系统在特定条件下的表现&#xff0c;包…

Vue 框架使用难点与易错点剖析:避开陷阱,提升开发效率

Vue.js 作为当下最流行的前端框架之一&#xff0c;以其轻量、易用和灵活的特性深受开发者喜爱。然而&#xff0c;即使是经验丰富的开发者&#xff0c;在使用 Vue 的过程中也难免会遇到一些难点和易错点。本文将深入分析 Vue 开发中常见的“坑”&#xff0c;并提供解决方案和代码…

基于大模型的上睑下垂手术全流程预测与方案优化研究报告

目录 一、引言 1.1 研究背景与目的 1.2 研究意义 1.3 研究方法与创新点 二、上睑下垂相关理论基础 2.1 上睑下垂的定义与分类 2.2 发病机制与影响 2.3 传统治疗方法概述 三、大模型技术原理与应用 3.1 大模型概述 3.2 在医疗领域的应用现状 3.3 用于上睑下垂预测的…

Odoo Http鉴权+调用后端接口

最近在调研Odoo18&#xff0c;包括它的前后端原理、源码等。发现官方的开发文档并不十分实用&#xff0c;比如标题这种简单的实用需求&#xff0c;竟然浪费了一点时间&#xff0c;特此记录。 官方文档&#xff1a;External API — Odoo 18.0 documentation 前提&#xff1a;首…

【Go每日一练】实现简单的控制台计算器

&#x1f47b;创作者&#xff1a;丶重明 &#x1f47b;创作时间&#xff1a;2025年3月7日 &#x1f47b;擅长领域&#xff1a;运维 目录 1.&#x1f636;‍&#x1f32b;️题目&#xff1a;简单的控制台计算器2.&#x1f636;‍&#x1f32b;️代码输出3.&#x1f636;‍&#…

Linux常见问题与分析

操作系统进行线程切换时进行的动作 1. 保存当前线程的上下文 寄存器状态&#xff1a;保存 CPU 寄存器&#xff08;如通用寄存器、程序计数器 PC、栈指针 SP 等&#xff09;到当前线程的 线程控制块&#xff08;TCB&#xff09; 中。内核栈信息&#xff1a;如果线程在内核态运…

HTML块级元素和内联元素(简单易懂)

在HTML中&#xff0c;元素可以分为块级元素&#xff08;Block-level elements&#xff09;和内联元素&#xff08;Inline elements&#xff09;。这两类元素在页面布局和样式应用上有不同的特点和用途。 一、块级元素&#xff08;Block-level elements&#xff09; 1. 定义 …

VSTO(C#)Excel开发6:与窗体交互

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 源码指引&#xff1a;github源…

Node.js与VUE安装

目录 Win下载安装 Mac下载安装 Win与Mac配置检查是否安装成功切换淘宝NPM库检查镜像配置是否生效设置 npm 全局环境目录&#xff08;避免权限问题&#xff09;WinMac VUE CLI安装安装验证打开vue面板 Vue脚手架npm init vuelatest、npm create vuelatestvue create、vue ui Win…

快速集成1688商品API:10分钟实现跨境选品数据自动化

要快速集成 1688 商品 API 以实现跨境选品数据自动化&#xff0c;可参考以下步骤&#xff1a; 注册并申请 API 权限&#xff1a;注册账号创建应用并申请所需的 API 权限&#xff0c;如商品搜索、筛选、获取详情等相关权限。获取 API Key 和 Secret&#xff1a;在应用管理页面获…

解决 MySQL 迁移到达梦报错 “无效的列名” 的问题

在数据库迁移的过程中&#xff0c;常常会遇到各种各样的问题。本文将聚焦于从源库 MySQL&#xff08;大小写不敏感&#xff09;迁移到目标库达梦&#xff08;大小写敏感&#xff09;时&#xff0c;出现的创建索引报错 “无效的列名” 这一问题&#xff0c;使用SQLark工具如何避…

工程化与框架系列(31)--前端依赖管理实践

前端依赖管理实践 &#x1f4e6; 引言 前端依赖管理是现代Web开发中的重要环节。本文将深入探讨前端依赖管理的最佳实践&#xff0c;包括包管理工具、版本控制、依赖分析和优化等方面&#xff0c;帮助开发者更好地管理项目依赖。 依赖管理概述 前端依赖管理主要包括以下方面…

C/C++都有哪些开源的Web框架?

CppCMS CppCMS是一个采用C语言开发的高性能Web框架&#xff0c;通过模版元编程方式实现了在编译期检查RESTful路由系统&#xff0c;支持传统的MVC模式和多种语言混合开发模式。 CppCMS最厉害的功能是WebSocket&#xff0c;10万连接在内存中长期保存占用的大小不超过600MB&…

数据结构——环形数组

环形数组 start 指向第一个有效元素的索引&#xff0c;end 指向最后一个有效元素的下一个位置索引。 注意&#xff1a; start是闭区间&#xff0c;先左移后赋值&#xff0c;先赋值(null)后右移&#xff1b;end是开区间&#xff0c;先赋值再右移&#xff0c;先左移再赋值(null…

大数据学习(59)-DataX执行机制

&&大数据学习&& &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 承认自己的无知&#xff0c;乃是开启智慧的大门 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4dd;支持一下博主哦&#x1f91…

云原生性能测试全解析:如何构建高效稳定的现代应用?

一、引言 随着云计算技术的快速发展&#xff0c;云原生&#xff08;Cloud Native&#xff09;架构成为现代应用开发的主流模式。云原生应用通常采用微服务架构、容器化部署&#xff0c;并利用 Kubernetes&#xff08;K8s&#xff09;等编排工具进行管理。然而&#xff0c;云原…

golang的Map

Map集合 概述 Map 是一种无序的键值对的集合。 Map 最重要的一点是通过 key 来快速检索数据&#xff0c;key 类似于索引&#xff0c;指向数据的值。 Map 是一种集合&#xff0c;所以我们可以像迭代数组和切片那样迭代它。不过&#xff0c;Map 是无序的&#xff0c;遍历 Map…

USB数据采集卡 Labview采集卡 32路AD模拟量采集 DAQ卡

今天给大家介绍阿尔泰科技的一款多功能数据采集卡USB3150/1/2/5/6 。 该板卡提供 32RSE / NRSE 通道或 16 通道 DIFF 模 拟量输入&#xff1b;4 通道模拟量同步输出&#xff1b;16 路可编程 I/O&#xff1b;2 路计数器。 USB3150/1/2/5/6 的主要应用场合为&#xff1a;电子产品…

K8s 1.27.1 实战系列(十)PV PVC

一、核心概念与关系 ​1、PV(Persistent Volume)​ PV 是集群中的持久化存储资源,由管理员预先创建并配置,独立于 Pod 生命周期。它抽象了底层存储(如 NFS、云存储等),定义存储容量、访问模式(如 ReadWriteOnce)、回收策略(Retain/Delete/Recycle)等属性。例如,一…

基于DeepSeek的智能数据分析和自动化处理系统:引领BI行业新变革

近期&#xff0c;一款基于DeepSeek API的智能数据分析和自动化处理系统横空出世&#xff0c;以其强大的功能和灵活的可扩展性&#xff0c;为BI行业带来了颠覆性的变革。 该系统支持多类型数据分析&#xff0c;包括文本 、指标和日志等。在文本分析方面&#xff0c;它能够提取关…