当前位置: 首页 > news >正文

MyBatis一二级缓存的区别?

大家好,我是锋哥。今天分享关于【MyBatis一二级缓存的区别?】面试题。希望对大家有帮助;

MyBatis一二级缓存的区别?

1000道 互联网大厂Java工程师 精选面试题-Java资源分享网

MyBatis 的缓存机制分为 一级缓存二级缓存,它们在作用范围和存储位置等方面有一些显著的区别。以下是它们的详细区别:

1. 一级缓存(Local Cache)

  • 作用范围:一级缓存是与 SqlSession 绑定的缓存。每次创建 SqlSession 时,都会为该 SqlSession 分配一个一级缓存,生命周期仅限于该 SqlSession。也就是说,只要 SqlSession 没有关闭,缓存的数据就会存在;一旦 SqlSession 关闭,缓存数据就会丢失。

  • 存储位置:一级缓存存储在 SqlSession 内部,是本地缓存。

  • 工作方式:如果在同一个 SqlSession 中多次查询相同的数据,MyBatis 会先从一级缓存中查找数据,如果缓存中有数据,就直接返回,而不会执行数据库查询。如果缓存中没有数据,才会执行 SQL 查询并将结果缓存到一级缓存中。

  • 清空机制:一级缓存会在以下情况下被清空:

    • 执行了 commit() 或 rollback()
    • SqlSession 被关闭。
    • 手动调用 clearCache() 清空缓存。
  • 优点:由于一级缓存与 SqlSession 绑定,它的数据访问速度非常快,且不会产生额外的存储消耗。

  • 缺点:只能在同一个 SqlSession 内共享缓存,因此不适用于跨 SqlSession 的缓存共享。

2. 二级缓存(Global Cache)

  • 作用范围:二级缓存是与 SqlSessionFactory 绑定的缓存。也就是说,二级缓存可以跨多个 SqlSession 共享,整个应用程序可以共享二级缓存中的数据。它的生命周期与 SqlSessionFactory 关联,只要 SqlSessionFactory 存在,二级缓存就会存在。

  • 存储位置:二级缓存通常存储在内存中,但它也可以配置为使用外部缓存(如 Redis、Ehcache 等)。

  • 工作方式:二级缓存是在多个 SqlSession 之间共享的。当在一个 SqlSession 执行查询时,MyBatis 会先查询一级缓存,如果没有找到,再查询二级缓存。如果二级缓存也没有找到数据,才会执行数据库查询并将查询结果存储到二级缓存中,供其他 SqlSession 共享。

  • 清空机制:二级缓存的清空机制比较复杂,通常在以下情况下会清空:

    • 数据库表中的数据发生变化时,执行了增删改操作。
    • SqlSessionFactory 重新加载或刷新时。
    • 手动调用 clearCache() 清空缓存。
  • 优点:由于二级缓存可以跨多个 SqlSession 共享,因此可以大大提高跨会话的数据读取效率,减少数据库的访问压力。

  • 缺点:二级缓存的存储和清空机制更加复杂,需要进行配置,并且可能会引入一些同步问题(例如数据一致性问题)。

3. 一级缓存和二级缓存的关系

  • 级别差异:一级缓存是局部缓存,只作用于当前 SqlSession,而二级缓存是全局缓存,作用于整个 SqlSessionFactory

  • 缓存命中顺序:MyBatis 的缓存机制是按照优先级顺序访问的,即:查询数据时,首先会查询一级缓存,如果一级缓存没有,再查询二级缓存。如果二级缓存也没有,才会进行数据库查询。

  • 缓存一致性:一级缓存是由 SqlSession 管理的,不会跨 SqlSession,因此不存在一致性问题。而二级缓存是跨 SqlSession 的共享缓存,在分布式或多线程环境下需要特别小心缓存一致性问题,可能需要引入外部缓存框架来处理。

4. 配置二级缓存

二级缓存需要通过配置文件显式开启并配置。在 MyBatis 的 XML 配置文件中,你需要做以下几步:

  1. 开启二级缓存: 在 mybatis-config.xml 文件中设置 <setting name="cacheEnabled" value="true"/>

  2. 在 Mapper 文件中启用缓存: 每个 Mapper 文件中的 <mapper> 元素需要添加 <cache/> 元素来启用二级缓存。

    <mapper namespace="com.example.mapper.UserMapper"><cache/><!-- 其他映射语句 -->
    </mapper>
    

  3. 配置缓存的实现类: 可以选择默认的缓存实现(如 PerpetualCache),也可以使用外部的缓存库(如 Ehcache)。

    <settings><setting name="cacheImplementation" value="org.mybatis.caches.ehcache.EhcacheCache"/>
    </settings>
    

  4. 缓存的清理策略: 你可以使用 flushCache 属性来控制缓存清理策略。

总结

  • 一级缓存:是基于 SqlSession 的局部缓存,生命周期短,性能高,但不能跨会话共享数据。
  • 二级缓存:是基于 SqlSessionFactory 的全局缓存,跨多个 SqlSession 共享数据,适合于跨会话的数据复用,但需要配置和管理。

通过合理地配置和使用一级缓存和二级缓存,可以有效地提升 MyBatis 的性能,减少不必要的数据库查询操作。

相关文章:

MyBatis一二级缓存的区别?

大家好&#xff0c;我是锋哥。今天分享关于【MyBatis一二级缓存的区别&#xff1f;】面试题。希望对大家有帮助&#xff1b; MyBatis一二级缓存的区别&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 MyBatis 的缓存机制分为 一级缓存 和 二级缓存&…...

[2024-12 CISCN 长城杯] Crypto

fffffhash 【也可以看这题&#xff0c;一样的&#xff1a;https://github.com/DownUnderCTF/Challenges_2023_Public/blob/main/crypto/fnv/solve/solution_joseph_LLL.sage】 题目描述&#xff1a; import os from Crypto.Util.number import * def giaogiao(hex_string):b…...

pytorch bilstm crf的教程,注意 这里不支持批处理,要支持批处理 用torchcrf这个。

### Bi-LSTM Conditional Random Field ### pytorch tutorials https://pytorch.org/tutorials/beginner/nlp/advanced_tutorial.html ### 模型主要结构&#xff1a; ![title](sources/bilstm.png) pytorch bilstm crf的教程&#xff0c;注意 这里不支持批处理 Python version…...

Python毕业设计选题:基于django+vue的疫情数据可视化分析系统

开发语言&#xff1a;Python框架&#xff1a;djangoPython版本&#xff1a;python3.7.7数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat11开发软件&#xff1a;PyCharm 系统展示 管理员登录 管理员功能界面 用户管理 员工管理 疫情信息管理 检测预约管理 检测结果…...

tomcat被检测到目标URL存在htp host头攻击漏洞

AI越来越火了,我们想要不被淘汰就得主动拥抱。推荐一个人工智能学习网站,通俗易懂,风趣幽默,最重要的屌图甚多,忍不住分享一下给大家。点击跳转到网站 Tomcat被检测到目标URL存在http host头攻击漏洞,这个漏洞复现一下就是黑客访问你的网站,之后中修改请求头中的host属…...

1.初识python

文章目录 1.python背景知识2.python优缺点3.为什么要学习python 大家好&#xff0c;我是晓星航。今天为大家带来的是初识python 相关的讲解&#xff01;&#x1f600; 1.python背景知识 我们学习python需要做的事情&#xff1a; 1.python 环境搭建 2.python 基础语法 3.pyth…...

【密码学】ZUC祖冲之算法

一、ZUC算法简介 ZUC算法&#xff08;祖冲之算法&#xff09;是中国自主研发的一种流密码算法&#xff0c;2011年被3GPP批准成为4G国际标准&#xff0c;主要用于无线通信的加密和完整性保护。ZUC算法在逻辑上采用三层结构设计&#xff0c;包括线性反馈移位寄存器&#xff08;L…...

Python面试常见问题及答案8

一、基础部分 问题1&#xff1a; 解释Python中的切片&#xff08;slicing&#xff09;操作在列表、字符串上是如何工作的&#xff1f; 答案&#xff1a; 在列表和字符串中&#xff0c;切片操作可以获取其中的一部分元素。切片的语法是[start:stop:step]。 对于列表&#xff0…...

ASP.net Core EntityFramework Code EF code 汇总

Entity FrameWork EF 总结 EF Core EF Core 如果实体模型很多&#xff0c;全部放在 上下文中的 OnModelCreating(ModelBuilder modelBuilder) 不太好维护 可以把实体模型 分离出去&#xff0c;每个类创建一个实体模型 public class BookConfiguration &#xff1a;IEntityT…...

u3d动画系统五【StateMachineBehaviour类】

一.StateMachineBehaviour概述 状态机行为是一类特殊脚本。与将常规 Unity 脚本 (MonoBehaviour) 附加到单个游戏对象类似&#xff0c;您可以将 StateMachineBehaviour 脚本附加到状态机中的单个状态。因此可编写一些将在状态机进入、退出或保持在特定状态时执行的代码。这意味…...

IS-IS协议

IS-IS协议介绍 IS-IS&#xff08;Intermediate System to Intermediate System&#xff09;协议是一种链路状态的内部网关协议&#xff08;IGP&#xff09;&#xff0c;用于在同一个自治系统&#xff08;Autonomous System, AS&#xff09;内部的路由器之间交换路由信息。IS-I…...

使用C++实现RSA加密解密

一&#xff0c;RSA简介。 RSA&#xff0c;一种非对称加密方式。是目前为止最有影响力的加密算法之一&#xff0c;而且是第一个同时应用于加密和数字签名的算法。 其原理为&#xff1a;两个大素数相乘容易&#xff0c;但是若想将两个大素数相乘的积再分解为两个原始的素数很难…...

C++归并与快速

快排 #include<bits/stdc.h> #include<algorithm> using namespace std; void f(int,int); void cl(int,int,int); void q(int,int); int a[211]; int n; int main(){cin>>n;for(int i0;i<n;i){cin>>a[i];}q(0,n-1);for(int i0;i<n;i){cout<…...

金蝶云苍穹踩过的坑(慢慢更新)

IDEA不能用最新版&#xff0c;不然搜不到金蝶的插件。 我用的是2024.1.7/2023.1.7 IDEA里增加金蝶插件库的地址也变了&#xff0c;现在是 https://tool.kingdee.com/kddt/idea-updatePlugins.xml 金蝶云苍穹部署在服务器 MAC本地IDEA调试的时候&#xff0c;登录N次能成功一次…...

AndroidStudio——安卓项目结构与文件介绍

一、AndroidStudio界面 一个安卓项目界面主要由以下几部分组成&#xff1a; 1.菜单栏&#xff1a;位于顶部&#xff0c;基本的各项菜单操作 2.项目结构&#xff1a;通常位于左侧&#xff0c;展示当前项目的目录结构 3.编辑窗口&#xff1a;通常位于中间&#xff0c;可以用于编…...

华为自反ACL实验

一、实验背景 做这个实验的原因是最近公司里上了三台小程序服务器&#xff0c;由于三台服务器的端口都映射出去了&#xff0c;领导要求A网段的三台服务器不能访问内网B&#xff0c;C网段&#xff0c;同时B、C网段内网用户可以访问A段的94、95、96服务器&#xff1b; 也就是PC4\…...

yml和xml分别代表什么

YML 和 XML 是两种不同的数据序列化格式&#xff0c;它们在软件开发和数据交换中有着广泛的应用&#xff1a; YAML (YAML Ain’t Markup Language): YAML 是一种用于数据序列化的人类可读语言。它被设计为易于阅读和编写&#xff0c;特别适合于配置文件。YAML 使用缩进来表示数…...

Qt多线程编程

在Qt中&#xff0c;多线程编程是一个常见的需求&#xff0c;特别是当你需要执行耗时的后台任务而不希望阻塞用户界面时。多线程编程它允许应用程序同时执行多个任务&#xff0c;从而提高性能和响应速度。Qt提供了一套完善的多线程支持&#xff0c;包括线程类&#xff08;QThrea…...

springboot438校园志愿者管理系统(论文+源码)_kaic

摘 要 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解决一些老技术的弊端问题。因为传统校园志愿者管理系统信息管理难度大&#xff0c;容错率低&…...

PostgreSQL 常用运维SQL整理

一、查询并杀会话 -- 查询会话 select pid,usename,client_addr,client_port,query_start,query,wait_event from pg_stat_activity; -- 杀会话 select pg_terminate_backend(pid号); -- 使用如下命令自动生成杀会话语句 select datid,datname,pid,usesysid,usename,applicat…...

React hook之useRef

React useRef 详解 useRef 是 React 提供的一个 Hook&#xff0c;用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途&#xff0c;下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

FFmpeg 低延迟同屏方案

引言 在实时互动需求激增的当下&#xff0c;无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作&#xff0c;还是游戏直播的画面实时传输&#xff0c;低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架&#xff0c;凭借其灵活的编解码、数据…...

Java如何权衡是使用无序的数组还是有序的数组

在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...

mongodb源码分析session执行handleRequest命令find过程

mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程&#xff0c;并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令&#xff0c;把数据流转换成Message&#xff0c;状态转变流程是&#xff1a;State::Created 》 St…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析

这门怎么题库答案不全啊日 来简单学一下子来 一、选择题&#xff08;可多选&#xff09; 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘&#xff1a;专注于发现数据中…...

Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理

引言 Bitmap&#xff08;位图&#xff09;是Android应用内存占用的“头号杀手”。一张1080P&#xff08;1920x1080&#xff09;的图片以ARGB_8888格式加载时&#xff0c;内存占用高达8MB&#xff08;192010804字节&#xff09;。据统计&#xff0c;超过60%的应用OOM崩溃与Bitm…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)

目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关&#xff0…...

Python 高效图像帧提取与视频编码:实战指南

Python 高效图像帧提取与视频编码:实战指南 在音视频处理领域,图像帧提取与视频编码是基础但极具挑战性的任务。Python 结合强大的第三方库(如 OpenCV、FFmpeg、PyAV),可以高效处理视频流,实现快速帧提取、压缩编码等关键功能。本文将深入介绍如何优化这些流程,提高处理…...

Android写一个捕获全局异常的工具类

项目开发和实际运行过程中难免会遇到异常发生&#xff0c;系统提供了一个可以捕获全局异常的工具Uncaughtexceptionhandler&#xff0c;它是Thread的子类&#xff08;就是package java.lang;里线程的Thread&#xff09;。本文将利用它将设备信息、报错信息以及错误的发生时间都…...

规则与人性的天平——由高考迟到事件引发的思考

当那位身着校服的考生在考场关闭1分钟后狂奔而至&#xff0c;他涨红的脸上写满绝望。铁门内秒针划过的弧度&#xff0c;成为改变人生的残酷抛物线。家长声嘶力竭的哀求与考务人员机械的"这是规定"&#xff0c;构成当代中国教育最尖锐的隐喻。 一、刚性规则的必要性 …...