MyBatis的一级缓存和二级缓存:原理和作用

MyBatis的一级缓存和二级缓存:原理和作用

引言

在数据库访问中,缓存是一种重要的性能优化手段,它可以减少数据库查询的次数,加快数据访问速度。MyBatis作为一款流行的Java持久层框架,提供了一级缓存和二级缓存来帮助开发者优化数据库访问性能。本文将深入探讨MyBatis的一级缓存和二级缓存的原理和作用,以及如何配置和使用它们。

在这里插入图片描述

一级缓存(Local Cache)

1. 原理

一级缓存是MyBatis的默认缓存,也称为本地缓存。它是基于SqlSession的缓存,即在同一个SqlSession中执行的多次查询会将查询结果缓存在本地内存中。当同一个SqlSession中执行相同的SQL查询时,MyBatis会首先检查一级缓存,如果缓存中已经存在相同的查询结果,就直接返回缓存中的数据,而不会再次向数据库发出查询请求。

2. 作用

一级缓存的作用是提高相同查询的响应速度,减少数据库访问次数。在同一个SqlSession中,如果多次执行相同的查询,只有第一次会访问数据库,后续的查询会直接从一级缓存中获取数据,从而降低了数据库的负担。

3. 示例代码

下面是一个使用MyBatis的一级缓存的示例代码:

SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
SqlSession sqlSession = sessionFactory.openSession();UserMapper userMapper = sqlSession.getMapper(UserMapper.class);// 第一次查询,会访问数据库
User user1 = userMapper.findById(1);// 第二次查询,会从一级缓存中获取数据,而不会访问数据库
User user2 = userMapper.findById(1);sqlSession.close();

二级缓存(Global Cache)

1. 原理

二级缓存是MyBatis的全局缓存,它是基于整个应用程序的缓存,多个SqlSession可以共享二级缓存。当一个SqlSession执行查询时,查询结果会被缓存在二级缓存中。当其他SqlSession执行相同的查询时,如果缓存中存在相同的查询结果,就可以直接返回缓存中的数据,而不必再次访问数据库。

2. 作用

二级缓存的作用是在多个SqlSession之间共享缓存数据,从而提高应用程序的性能。它适用于需要缓存共享的数据,如基础数据表(如国家、城市)等,以减少数据库查询的负担。

3. 配置与使用

要启用二级缓存,需要进行以下配置:

3.1 在MyBatis配置文件中开启二级缓存
<settings><setting name="cacheEnabled" value="true"/>
</settings>
3.2 在Mapper XML 文件中配置缓存
<mapper namespace="com.example.UserMapper"><cache/><!-- 其他查询语句 -->
</mapper>
3.3 在POJO类中实现序列化(Serializable)
public class User implements Serializable {// 属性和方法
}
3.4 使用二级缓存
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
SqlSession sqlSession1 = sessionFactory.openSession();
SqlSession sqlSession2 = sessionFactory.openSession();UserMapper userMapper1 = sqlSession1.getMapper(UserMapper.class);
UserMapper userMapper2 = sqlSession2.getMapper(UserMapper.class);// 第一次查询,会访问数据库,并缓存到二级缓存
User user1 = userMapper1.findById(1);// 第二次查询,会从二级缓存中获取数据,而不会访问数据库
User user2 = userMapper2.findById(1);sqlSession1.close();
sqlSession2.close();

一级缓存 vs. 二级缓存

1. 作用范围

  • 一级缓存:作用于单个SqlSession,只在当前SqlSession中有效。
  • 二级缓存:作用于整个应用程序,多个SqlSession可以共享缓存数据。

2. 时效性

  • 一级缓存:只在当前SqlSession的生命周期内有效,当SqlSession关闭后,一级缓存也会被清空。
  • 二级缓存:可以长期保持缓存数据,不受SqlSession的生命周期限制。

3. 配置

  • 一级缓存:无需额外配置,默认开启。
  • 二级缓存:需要进行配置和实现序列化。

4. 适用场景

  • 一级缓存:适用于需要在同一个SqlSession中多次查询相同数据的场景。
  • 二级缓存:适用于需要在多个SqlSession之间共享数据的场景,如基础数据表等。

总结

MyBatis的一级缓存和二级缓存是优化数据库访问性能的重要工具。一级缓存提供了在同一个SqlSession中缓存查询结果的能力,减少了数据库访问次数。二级缓存则允许多个SqlSession共享缓存数据,提高了应用程序的性能,但需要额外的配置和序列化。开发者可以根据项目的需求和性能优化的要求来选择使用一级缓存、二级缓存或两者结合的方式,以提高MyBatis应用程序的性能和响应速度。希望本文能帮助您理解MyBatis缓存

的原理和使用方法。

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

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

相关文章

基于Java的大学生就业招聘系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

【数据结构】排序算法(一)—>插入排序、希尔排序、选择排序、堆排序

&#x1f440;樊梓慕&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》 &#x1f31d;每一个不曾起舞的日子&#xff0c;都是对生命的辜负 目录 前言 1.直接插入排序 2.希尔排序 3.直接选择排…

OpenCV之分水岭算法(watershed)

Opencv 中 watershed函数原型&#xff1a; void watershed( InputArray image, InputOutputArray markers ); 第一个参数 image&#xff0c;必须是一个8bit 3通道彩色图像矩阵序列&#xff0c;第一个参数没什么要说的。关键是第二个参数 markers&#xff0c;Opencv官方文档的说…

全网最全Python系列教程(非常详细)---集合讲解(学Python入门必收藏)

&#x1f9e1;&#x1f9e1;&#x1f9e1;这篇是关于Python中集合的讲解&#xff0c;涉及到以下内容&#xff0c;欢迎点赞和收藏&#xff0c;你点赞和收藏是我更新的动力&#x1f9e1;&#x1f9e1;&#x1f9e1; 1、集合是什么&#xff1f; 2、集合应该怎么去定义&#xff1f…

搭建前端框架

在终端进入web目录&#xff0c;然后创建vuecrud工程 创建工程并引入ElementUI和axios手把手教学>传送门:VueCLI脚手架搭建

力扣 -- 718. 最长重复子数组

解题步骤&#xff1a; 参考代码&#xff1a; class Solution { public:int findLength(vector<int>& nums1, vector<int>& nums2) {int m nums1.size();int n nums2.size();//多开一行&#xff0c;多开一列vector<vector<int>> dp(m 1, ve…

Ghostscript 在 Linux 和 Windows 系统的应用与问题解决

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

背诵不等于理解,深度解析大模型背后的知识储存与提取

自然语言模型的背诵 (memorization) 并不等于理解。即使模型能完整记住所有数据&#xff0c;也可能无法通过微调 (finetune) 提取这些知识&#xff0c;无法回答简单的问题。 随着模型规模的增大&#xff0c;人们开始探索大模型是如何掌握大量知识的。一种观点认为这归功于 “无…

【ARMv8 SIMD和浮点指令编程】NEON 加载指令——如何将数据从内存搬到寄存器(其它指令)?

除了基础的 LDx 指令,还有 LDP、LDR 这些指令,我们也需要关注。 1 LDNP (SIMD&FP) 加载 SIMD&FP 寄存器对,带有非临时提示。该指令从内存加载一对 SIMD&FP 寄存器,向内存系统发出访问是非临时的提示。用于加载的地址是根据基址寄存器值和可选的立即偏移量计算…

计算机网络(一):概述

参考引用 计算机网络微课堂-湖科大教书匠计算机网络&#xff08;第7版&#xff09;-谢希仁 1. 计算机网络在信息时代的作用 计算机网络已由一种通信基础设施发展成为一种重要的信息服务基础设施计算机网络已经像水、电、煤气这些基础设施一样&#xff0c;成为我们生活中不可或…

网络协议--概述

1.2 分层 网络协议通常分不同层次进行开发&#xff0c;每一层分别负责不同的通信功能。一个协议族&#xff0c;比如TCP/IP&#xff0c;是一组不同层次上的多个协议的组合。 TCP/IP通常被认为是一个四层协议系统&#xff0c;如图1-1所示。每一层负责不同的功能&#xff1a; 1.链…

【Vue.js】使用Element中的Mock.js搭建首页导航左侧菜单---【超高级教学】

一&#xff0c;Mock.js 1.1 认识Mock.js Mock.js是一个用于前端开发中生成随机数据、模拟接口响应的 JavaScript 库。模拟数据的生成器&#xff0c;用来帮助前端调试开发、进行前后端的原型分离以及用来提高自动化测试效率 总结来说&#xff0c;Element中的Mock.js是一个用于…

ClassNotFoundException与NoClassDefFoundError

如果这springboot服务启动时两个报错同时出现&#xff0c;那大概率是依赖间冲突导致的 查资料发现是springcloud的依赖版本和springboot的依赖版本不兼容&#xff0c;顺藤摸瓜找到springcloud jar包中调用org.springframework.boot.context.properties.ConfigurationProperties…

《MySQL高级篇》十六、主从复制

文章目录 1、主从复制概述1.1 如何提升数据库并发能力1.2 主从复制的作用 2、主从复制的原理2.1 原理剖析2.2 复制的基本原则 3、一主一从架构搭建3.1 准备工作3.2 主机配置文件3.3 从机配置文件3.4 主机&#xff1a;建立账户并授权3.5 从机&#xff1a;配置需要复制的主机3.6 …

为何每个开发者都在谈论Go?

目录 一、引言Go的历史回顾关键时间节点 使用场景Go的语言地位技术社群与企业支持资源投入和生态系统 二、简洁的语法结构基本组成元素变量声明与初始化代码示例 类型推断函数与返回值代码示例输出 接口与结构体&#xff1a;组合而非继承错误处理&#xff1a;明确而不是异常小结…

Python集成开发环境(IDE):WingPro for Mac

WingPro for Mac是一款Python集成开发环境&#xff08;IDE&#xff09;软件&#xff0c;它提供了一系列强大的工具和功能&#xff0c;帮助Python开发人员提高开发效率和质量。 WingPro for Mac拥有直观的用户界面和强大的调试器&#xff0c;可以帮助用户快速定位问题和修复错误…

10.1作业

#include <stdio.h> #include <string.h> #include <stdlib.h> /** function:* 创建一个双向链表&#xff0c;将26个英文字母通过头插的方式插入&#xff0c;通过为尾删的方式读取并删除* param [ in] * param [out] * return */ typedef struct double…

Redis代替session 实现登录流程

Redis代替session 实现登录流程 如果使用String&#xff0c;他的value&#xff0c;用多占用一点空间&#xff0c;如果使用哈希&#xff0c;则他的value中只会存储他数据本身&#xff0c;如果不是特别在意内存&#xff0c;其实使用String就可以 设计key的具体细节 在设计这个k…

Learning Invariant Representation for Unsupervised Image Restoration

Learning Invariant Representation for Unsupervised Image Restoration (Paper reading) Wenchao Du, Sichuan University, CVPR20, Cited:63, Code, Paper 1. 前言 近年来&#xff0c;跨域传输被应用于无监督图像恢复任务中。但是&#xff0c;直接应用已有的框架&#xf…

私有继承和虚函数私有化能用么?

源起 以前就知道private私有化声明关键字&#xff0c;和virtual虚函数关键字两者并不冲突&#xff0c;可以同时使用。 但是&#xff0c;它所表示的场景没有那么明晰&#xff0c;也觉得难以理解&#xff0c;直到近段时间遇到一个具体场景。 场景 借助ACE遇到的问题进行展示 …