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

news2024/11/27 23:49:46

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.coloradmin.cn/o/1052684.html

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

相关文章

机器学习之广义增量规则(Generalized Delta Rule)

文章目录 广义增量规则的公式s型函数的增量规则 广义增量规则的公式 对于单层神经网络的增量规则&#xff0c;已经过时啦&#xff0c;现在存在一种更广义的增量规则形式。对于任意激活函数&#xff0c;增量规则表示如下式它与前一节的delta规则相同&#xff0c;只是ei被替换为…

案例突破——再探策略模式

再探设计模式 一、背景介绍二、 思路方案三、过程1. 策略模式基本概念2. 策略模式类图3. 策略模式基本代码策略类抽象策略类Context类客户端 4. 策略模式还可以进行优化的地方5. 对策略模式的优化&#xff08;配置文件反射&#xff09; 四、总结五、升华 一、背景介绍 在做项目…

ccf_csp第一题汇总

ccf_csp第一题汇总 printf()输出格式大全&#xff08;附 - 示例代码&#xff09;现值计算AcWing 4699. 如此编码AcWing 4509. 归一化处理(小数位数根号函数)AcWing 4454. 未初始化警告AcWing 4280. 序列查询AcWing 4006. 数组推导(小陷阱)AcWing 3292. 称检测点查询AcWing 3287…

git你学“废”了吗?——git本地仓库的创建

git你学“废”了吗&#xff1f;——git本地仓库的创建&#x1f60e; 前言&#x1f64c;初识gitgit 本地仓库的创建1、基于centos7环境下 git的下载2、设置自己的用户名和邮箱 查看.git中的结构区分清楚版本库和工作区 查看git中的相关内容查看仓库的状态 总结撒花&#x1f49e;…

给奶牛做直播之一

一、前言 前几天看了薇亚写的一本书《人生是用来改变的》&#xff0c;和同事聊的时候同事问我这本书讲了什么&#xff0c;我回想了一下说主要是讲&#xff1a;我很辛苦&#xff0c;我很上进&#xff0c;我很牛逼&#xff0c;我很善良&#xff01;话说成功人士放个屁都是香的&am…

[题]修剪草坪 #单调队列优化

题目 洛谷上的题目 Acwing上的题目 根据y总的一波分析&#xff0c;我们得出……公式就是一切…… 所以&#xff0c;我要学会推公式…… 推公式…… 公式…… #include<bits/stdc.h> using namespace std; typedef long long ll; const int N 1e5 10; int n, m; ll s[N…

知识库系统都有哪些?知识库系统功能和介绍

知识库的建立是企业数字化转型的重要一步&#xff0c;能够为企业的可持续发展奠定坚实的基础。使用HelpLook创建的知识库知识库系统已经成为当前很多人的选择。 HelpLook可以实现并制作企业帮助中心设计、产品说明书、常见问题手册、在线知识库、企业文档制作。 点击注册使用&…

pip version 更新

最近报了一个错&#xff1a; 解决办法&#xff1a; 在cmd输入“conda install pip” conda install pip 完了之后再输入&#xff1a; python -m pip install --upgrade pip ok.

面试题六:Promise的使用,一文详细讲解

含义 Promise是异步编程的一种解决方案&#xff0c;比传统的解决方案&#xff08;回调函数和事件&#xff09;更合理更强大。 所谓Promise&#xff0c;简单说就是一个容器&#xff0c;里面保存着某个未来才会结束的事件 (通常是一个异步操作)的结果。从语法上说&#xff0c;P…

WPF 01

xaml是声明性语言 每见到一个标签&#xff0c;就意味着xaml为我们声明一个标签对应的对象。 在XAML中为对象属性赋值 1. AttributeValue形式 <Grid><Rectangle Width"100" Height"80" Stroke"Black" Fill"Blue" RadiusX&q…

Mybatis 二级缓存(使用Redis作为二级缓存)

上一篇我们介绍了mybatis中二级缓存的使用&#xff0c;本篇我们在此基础上介绍Mybatis中如何使用Redis作为二级缓存。 如果您对mybatis中二级缓存的使用不太了解&#xff0c;建议您先进行了解后再阅读本篇&#xff0c;可以参考&#xff1a; Mybatis 二级缓存https://blog.csd…

oracle分组合并数值带顺序

比如&#xff1a;有如下一张设备电子围栏位置坐标的表&#xff08;tb_equ_point&#xff09;。 equ_name:设备电子围栏名称 point_id:点位坐标id point_x:点位x坐标 point_y:点位y坐标。 附数据&#xff1a; INSERT INTO "tb_equ_point" ("EQU_NAME",…

数据结构题型11-顺序队列

#include <iostream> //引入头文件 using namespace std;typedef int Elemtype;#define Maxsize 5 #define ERROR 0 #define OK 1typedef struct {Elemtype data[Maxsize];int front, rear; }SqQueue;void InitQueue(SqQueue& Q) //初始化队列 {Q.rear Q.front…

使用代理IP进行安全高效的竞争情报收集,为企业赢得竞争优势

在激烈的市场竞争中&#xff0c;知己知彼方能百战百胜。竞争对手的信息对于企业来说至关重要&#xff0c;它提供了洞察竞争环境和市场的窗口。在这个信息时代&#xff0c;代理IP是一种实用的工具&#xff0c;可以帮助企业收集竞争对手的产品信息和营销活动数据&#xff0c;为企…

lv5 嵌入式开发-11 消息队列

掌握&#xff1a;消息队列机制、打开/创建消息队列、发送消息、接收消息 1 消息队列 消息队列是System V IPC对象的一种 消息队列由消息队列ID来唯一标识 消息队列就是一个消息的列表。用户可以在消息队列中添加消息、读取消息等 消息队列可以按照类型来发送/接收消息 消…

Win10自带输入法怎么删除-Win10卸载微软输入法的方法

Win10自带输入法怎么删除&#xff1f;Win10系统自带输入法就是微软输入法&#xff0c;这个输入法满足了很多用户的输入需求。但是&#xff0c;有些用户想要使用其它的输入法&#xff0c;这时候就想删除掉微软输入法。下面小编给大家介绍最简单方便的卸载方法吧。 Win10卸载微软…

数据挖掘(1)概述

一、数据仓库和数据挖掘概述 1.1 数据仓库的产生 数据仓库与数据挖掘&#xff1a; 数据仓库和联机分析处理技术(存储)。数据挖掘&#xff1a;在大量的数据中心挖掘感兴趣的知识、规则、规律、模式、约束(分析)。数据仓库用于决策分析&#xff1a; 数据仓库&#xff1a;是在数…

在Qt中,怎么获取到在mainwindow.ui文件中添加的控件

2023年9月30日&#xff0c;周六晚上 假设我在mainwindow.ui中添加了一个名为textEdit的QTextEdit对象 在mainwindow.cpp中&#xff0c;可以通过ui对象来获取到这个控件

妙不可言的Python之旅----(一)

初识Python python的起源 1989年&#xff0c;为了打发圣诞节假期&#xff0c;Gudio van Rossum吉多 范罗苏姆&#xff08;龟叔&#xff09;决心开发一个新的解释程序&#xff08;Python雏形&#xff09; 1991年&#xff0c;第一个Python解释器诞生 Python这个名字&#xff…

怎么修改jupyter lab 的工作路径而不是直接再桌面路径打开

要修改Jupyter Lab的工作路径&#xff0c;你可以按照以下步骤操作&#xff1a; 打开终端或命令提示符窗口。 输入 jupyter lab --generate-config 命令来生成Jupyter Lab的配置文件。 找到生成的配置文件&#xff0c;通常会位于 ~/.jupyter/jupyter_notebook_config.py。 使…