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

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器

一.自适应梯度算法Adagrad概述 Adagrad&#xff08;Adaptive Gradient Algorithm&#xff09;是一种自适应学习率的优化算法&#xff0c;由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率&#xff0c;适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

UE5 学习系列(三)创建和移动物体

这篇博客是该系列的第三篇&#xff0c;是在之前两篇博客的基础上展开&#xff0c;主要介绍如何在操作界面中创建和拖动物体&#xff0c;这篇博客跟随的视频链接如下&#xff1a; B 站视频&#xff1a;s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

2.Vue编写一个app

1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

微信小程序 - 手机震动

一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注&#xff1a;文档 https://developers.weixin.qq…...

Module Federation 和 Native Federation 的比较

前言 Module Federation 是 Webpack 5 引入的微前端架构方案&#xff0c;允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...

九天毕昇深度学习平台 | 如何安装库?

pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子&#xff1a; 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...

C++.OpenGL (14/64)多光源(Multiple Lights)

多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...

Go 并发编程基础:通道(Channel)的使用

在 Go 中&#xff0c;Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式&#xff0c;用于在多个 Goroutine 之间传递数据&#xff0c;从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...

华为OD机考-机房布局

import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...

通过 Ansible 在 Windows 2022 上安装 IIS Web 服务器

拓扑结构 这是一个用于通过 Ansible 部署 IIS Web 服务器的实验室拓扑。 前提条件&#xff1a; 在被管理的节点上安装WinRm 准备一张自签名的证书 开放防火墙入站tcp 5985 5986端口 准备自签名证书 PS C:\Users\azureuser> $cert New-SelfSignedCertificate -DnsName &…...