myabtis的缓存级别

news/2025/2/11 14:08:45/

文章目录

  • MyBatis缓存的区别是什么
  • 作用范围方面有哪些差异
  • 生命周期
  • 数据进行了存储
  • 缓存的优缺点

MyBatis缓存的区别是什么

MyBatis 提供了一级缓存和二级缓存,这两者的主要区别在于其作用范围和生命周期。

  1. 一级缓存:一级缓存是 SqlSession 级别的缓存。当我们执行查询时,它就会将查询结果缓存起来。当我们再次查询相同的数据,它就会直接从缓存中拉取。一级缓存是默认开启的。一级缓存的生命周期和 SqlSession 保持一致,当 SqlSession 被关闭或者清空,那么一级缓存就会消失
  2. 二级缓存:二级缓存是命名空间级别的缓存。一个命名空间可以理解为一个 Mapper 文件,即一个 XML 文件。不同的 Mapper 文件可以有不同的命名空间,即使它们都在同一个项目中。二级缓存是可以被多个 SqlSession 共享的。它的生命周期和应用程序保持一致,即应用程序运行期间,二级缓存一直存在。当应用程序关闭后,二级缓存才会消失

注意:使用二级缓存时,需要注意其适用场景。如果数据更新非常频繁,那么使用二级缓存可能不太合适,因为数据即使被更新,缓存中的数据也不会被立即清除,而是等待应用程序关闭后才会消失。这可能会导致数据不一致的问题。

作用范围方面有哪些差异

MyBatis的一级缓存和二级缓存的作用范围有明显的差异。

  1. 一级缓存是SqlSession级别的缓存,它的作用范围仅限于当前的SqlSession。也就是说,只有同一个SqlSession在执行两次相同的sql时,第一次得到的数据才会被缓存起来,第二次执行时直接从缓存中获取,提高效率。
  2. 而二级缓存是基于mapper的namespace作用域,但多个SqlSession操作同一个namespace下的sql时,只要传入的参数相同,执行相同的sql语句,第一次执行完毕后,会自动将sql提交并将数据缓存起来。也就是说,二级缓存在多个SqlSession之间共享数据,作用范围更广。
  3. 以上内容仅供参考,以MyBatis官方文档为准确 。

生命周期

MyBatis的缓存生命周期主要涉及到一级缓存和二级缓存。

  1. 一级缓存的生命周期和SqlSession保持一致。当开启一个新的数据库会话时,MyBatis会创建一个新的SqlSession对象,其中包含一个用于保存缓存数据的hashMap(以对象的id作为key,对象作为value保存)。当SqlSession执行DML(insert,update,delete)操作并提交到数据库时,MyBatis会清空SqlSession的一级缓存,以保存最新的数据并避免脏读现象。如果SqlSession调用close()方法或者clearCache()方法,一级缓存中的数据会被释放或者清空。
  2. 二级缓存的生命周期和应用程序保持一致,即应用程序运行期间,二级缓存一直存在。二级缓存是mapper级别的缓存,使用二级缓存时,多个SqlSession使用同一个mapper的sql语句去操作数据库,得到的数据存在二级缓存区域。二级缓存的范围更大,多个SqlSession可以共用二级缓存

以MyBatis官方文档为准确

数据进行了存储

MyBatis的一级缓存和二级缓存存储的数据主要是查询结果的对象。

  • 具体来说,一级缓存存储的是单个SqlSession中查询的数据,当同一个SqlSession再次查询相同的数据时,可以直接从缓存中获取,避免了重复的数据库查询操作,提高了效率。
  • 而二级缓存存储的是多个SqlSession之间共享的数据,当多个SqlSession查询相同的namespace下的数据时,只要传入的参数相同,执行相同的sql语句,第一次执行完毕后,会自动将sql提交并将数据缓存起来,供其他SqlSession使用,避免了重复的数据库查询操作,提高了效率。
  • 需要注意的是,MyBatis的二级缓存只会缓存查询语句,而不会缓存更新、插入、删除等语句。同时,MyBatis的二级缓存是将查询结果对象序列化后存储在硬盘上,读取时需要进行反序列化操作,因此在选择二级缓存时需要考虑到序列化和反序列化的开销。

缓存的优缺点

MyBatis 的一级缓存和二级缓存都有其优缺点

  • 优点
    • 一级缓存
      • 减少读数据库的读操作,降低数据库压力,加快响应速度
    • 二级缓存
      • 实现了缓存数据的共享,可控性也更强
  • 缺点
    • 一级缓存
      • 可能造成数据不一致问题
      • 增加成本
    • 二级缓存
      • 极大可能会出现错误数据
      • 安全使用的条件比较苛刻

MyBatis 的一级缓存和二级缓存都有其各自的优缺点。在选择使用缓存时,需要根据具体的应用场景和需求权衡这些优缺点,以做出最佳的选择。


http://www.ppmy.cn/news/1125997.html

相关文章

Centos配置链路聚合bond的步骤

Centos配置链路聚合的步骤如下: 查看网卡名称和状态 Shell # nmcli device status创建bond0网卡 Shell # vi /etc/sysconfig/network-scripts/ifcfg-bond0DEVICEbond0 ONBOOTyes BOOTPROTOnone NM_CONTROLLEDno BONDING_MASTERyes BONDING_OPTS"mode1 mii…

pg limit 的使用疑问 --chatGPT

问:pg 创建表 addresses , 父节点id,当前节点id,HT字段 12字节唯一,addr 地址 34字节 gpt: 你可以使用以下 SQL 命令在 PostgreSQL 中创建一个名为 addresses 的表,该表包含了父节点ID(parent_id)、当前节…

【STM32】读写内部Flash初步使用

基于stm32f103,作为个人学习记录使用 STM32 芯片内部有一个 FLASH 存储器,它主要用于存储代码,在紧急状态下常常会使用内部 FLASH 存储关键记录; 内部 FLASH 的构成 STM32 的内部 FLASH 包含主存储器、系统存储器以及选项字节区域 大容量…

OpenCV项目开发实战--使用 EigenFaces 进行人脸重建 (含C++/Python源码)

在这篇文章中,我们将学习如何使用 EigenFaces 重建面部。这篇文章是为初学者写的。如果您不了解主成分分析 (PCA) 或 EigenFaces。 什么是特征脸? 特征脸是可以添加到平均(平均)脸部以创建新的面部图像的图像。我们可以用数学方式将其写为: 在哪里,

timm模型无法联网下载采用本地读取

最新的timm版本(0.9.x)默认使用huggingface hub作为权重,优先于torch hub缓存,许多权重已经为模型更改重新映射,所以最好通过HF hub下载。Kaggle真的应该支持通过HF hub,或者至少正确地缓存它,但他们似乎没有兴趣让事情…

【PostgreSQL内核学习(十七)—— (AutoAnalyze)】

AutoAnalyze 概述AutoAnaProcess 类AutoAnaProcess 函数AutoAnaProcess::executeSQLCommand 函数AutoAnaProcess::runAutoAnalyze 函数AutoAnaProcess::run 函数AutoAnaProcess::check_conditions 函数AutoAnaProcess::cancelAutoAnalyze 函数AutoAnaProcess::~AutoAnaProcess …

TensorFlow入门(七、检查点)

保存检查点 在实际的模型训练中,TensorFlow难免会出现中断的情况,使得到的中间参数丢失,因此需要在模型训练过程中及时将模型保存下来。并将这种在训练中保存模型的操作,称为保存检查点 通过设置saver的另一个参数max_to_keep,指定生成检查点文件的个数,代码示例如下: saver…

Linux系统编程——进程间通信的学习

学习参考博文: 进程间的五种通信方式介绍Linux 信号介绍 Linux系统编程学习相关博文 Linux系统编程——文件编程的学习Linux系统编程——进程的学习Linux系统编程——线程的学习Linux系统编程——网络编程的学习 Linux系统编程——进程间通信的学习 一、概述1. 无…