当前位置: 首页 > 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…...

synchronized 学习

学习源&#xff1a; https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖&#xff0c;也要考虑性能问题&#xff08;场景&#xff09; 2.常见面试问题&#xff1a; sync出…...

设计模式和设计原则回顾

设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

VB.net复制Ntag213卡写入UID

本示例使用的发卡器&#xff1a;https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...

模型参数、模型存储精度、参数与显存

模型参数量衡量单位 M&#xff1a;百万&#xff08;Million&#xff09; B&#xff1a;十亿&#xff08;Billion&#xff09; 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的&#xff0c;但是一个参数所表示多少字节不一定&#xff0c;需要看这个参数以什么…...

DockerHub与私有镜像仓库在容器化中的应用与管理

哈喽&#xff0c;大家好&#xff0c;我是左手python&#xff01; Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库&#xff0c;用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件

今天呢&#xff0c;博主的学习进度也是步入了Java Mybatis 框架&#xff0c;目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学&#xff0c;希望能对大家有所帮助&#xff0c;也特别欢迎大家指点不足之处&#xff0c;小生很乐意接受正确的建议&…...

pam_env.so模块配置解析

在PAM&#xff08;Pluggable Authentication Modules&#xff09;配置中&#xff0c; /etc/pam.d/su 文件相关配置含义如下&#xff1a; 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块&#xff0c;负责验证用户身份&am…...

【论文笔记】若干矿井粉尘检测算法概述

总的来说&#xff0c;传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度&#xff0c;通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...

苍穹外卖--缓存菜品

1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得&#xff0c;如果用户端访问量比较大&#xff0c;数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据&#xff0c;减少数据库查询操作。 缓存逻辑分析&#xff1a; ①每个分类下的菜品保持一份缓存数据…...

ardupilot 开发环境eclipse 中import 缺少C++

目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...