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

大厂面试真题-说一下Mybatis的缓存

首先看一下原理图

Mybatis提供了两种缓存机制:一级缓存(L1 Cache)和二级缓存(L2 Cache),旨在提高数据库查询的性能,减少数据库的访问次数。注意查询的顺序是先二级缓存,再一级缓存。

相关配置

映射文件中的开关(二级缓存的)

一级缓存(L1 Cache)

实现原理

一级缓存是SqlSession级别的缓存,它基于PerpetualCache类实现,该类是Mybatis默认的缓存实现,内部使用HashMap来存储缓存数据。每个SqlSession在创建时都会关联一个Executor,Executor中包含了两个重要的缓存对象:localCachelocalOutputParameterCache(后者主要用于存储过程调用,此处主要讨论localCache)。

BaseExecutor类中,localCache被初始化为PerpetualCache的实例,并存储在Executor对象中。当执行查询操作时,Mybatis会首先检查localCache中是否存在相同的查询(通过CacheKey来唯一标识一个查询),如果存在,则直接从缓存中返回结果;如果不存在,则执行数据库查询,将结果放入localCache中,并返回给调用者。

BaseExecutor类中,可以看到localCache的声明和初始化:

protected PerpetualCache localCache;  protected BaseExecutor(Configuration configuration, Transaction transaction) {  // ... 其他初始化代码  this.localCache = new PerpetualCache("LocalCache");  // ... 其他初始化代码  
}

PerpetualCache类实现了Cache接口,其内部使用HashMap来存储缓存数据:

Executor

概述

Executor是Mybatis中的一个核心接口,它定义了数据库操作的基本方法,如查询(query)、更新(update)、提交(commit)、回滚(rollback)以及清空缓存(clearCache)等。Executor接口的实现类负责具体的SQL执行和缓存管理逻辑。

实现类

  • BaseExecutor:这是一个抽象类,实现了Executor接口的大部分方法,并为子类提供了缓存管理和事务管理的基本功能。子类需要实现doUpdatedoQuerydoQueryCursordoFlushStatements等四个基本方法来完成数据库的相关操作。
  • SimpleExecutor:这是BaseExecutor的一个子类,实现了最基础的SQL执行逻辑,每次执行SQL时都会创建一个新的Statement对象,并不涉及复杂的缓存机制。它是Mybatis的默认执行器。
  • ReuseExecutor:这个执行器实现了Statement的重用功能,它通过内部缓存机制,在同一个SqlSession范围内重用相同的Statement对象,以减少SQL预编译的开销。
  • BatchExecutor:顾名思义,这个执行器用于执行批量操作,它将多个SQL语句打包发送到数据库执行,以减少网络开销和提高性能。
特点与生效条件
  • 作用域:一级缓存是SqlSession级别的缓存,缓存的数据只在当前SqlSession内有效。
  • 默认状态:Mybatis默认开启一级缓存。
  • 生效条件:同一个SqlSession中执行相同的SQL查询时,第一次查询会查询数据库,并将结果存储在缓存中;后续的相同查询则直接从缓存中获取数据,不再访问数据库。
  • 失效条件
    1. 使用不同的SqlSession。
    2. 在同一个SqlSession中,两次查询之间执行了增删改操作(insert、update、delete),这些操作会清空SqlSession中的缓存。
    3. 手动清空了缓存。
    4. 两次查询的查询条件不一致。
应用场景

一级缓存适用于单个SqlSession中的多次相同查询场景,可以有效减少数据库的访问次数,提高查询效率。然而,由于其作用域限制,它不适用于跨SqlSession的查询优化。

二级缓存(L2 Cache)

实现原理

二级缓存是Mapper级别的缓存,它允许多个SqlSession共享缓存数据。二级缓存的开启需要在全局配置文件和Mapper XML文件中进行设置。在Mybatis中,二级缓存是通过Cache接口的实现类来管理的,但Mybatis默认提供了PerpetualCache作为二级缓存的实现。

当二级缓存开启后,Mybatis会为每个Mapper的namespace创建一个独立的缓存区域。当执行查询时,Mybatis会首先检查该Mapper的二级缓存中是否存在相同的查询结果;如果存在,则直接返回缓存中的数据;如果不存在,则执行数据库查询,将结果放入二级缓存中,并返回给调用者。

CachingExecutor

概述

CachingExecutorExecutor的一个实现类,它通过包装其他Executor实现类(如SimpleExecutorReuseExecutorBatchExecutor,这里使用的是装饰器模式),实现了二级缓存机制。它首先检查缓存中是否存在相同查询的结果,如果存在则直接返回缓存中的结果,否则通过被包装的Executor执行查询操作,并将结果存入缓存。

实现步骤

  • 缓存检查:在执行查询操作之前,CachingExecutor会首先检查其管理的二级缓存中是否存在相同查询的结果。这通常通过比较查询的CacheKey来实现,CacheKey是根据查询的SQL语句、参数等信息生成的唯一标识符。
  • 执行查询:如果缓存中不存在相同查询的结果,CachingExecutor会委托给被包装的Executor执行查询操作,并获取查询结果。
  • 缓存结果:将查询结果存入二级缓存中,以便后续相同的查询能够直接从缓存中获取结果。
  • 缓存管理CachingExecutor还负责缓存的清空、提交和回滚等操作,以确保数据的一致性和缓存的有效性。
特点与生效条件
  • 作用域:二级缓存是Mapper级别的缓存,同一个namespace下的所有SqlSession共享这个缓存。
  • 默认状态:Mybatis默认关闭二级缓存,需要手动开启。
  • 开启条件
    1. 在mapper.xml文件中设置<cache/>标签。
    2. 查询数据所转换的实体类类型必须实现序列化接口。
    3. 必须在SqlSession关闭或提交后,才会开启二级缓存。
  • 失效条件
    1. 同一个namespace下的增删改操作会清空缓存。
    2. 缓存超时设置(如果有的话)。
    3. 手动清空缓存。
应用场景
  1. 查询频率高且数据不经常变动的场景:当一个查询被频繁执行,且查询结果很少发生改变时,可以将查询结果缓存在二级缓存中,以提高查询性能。
  2. 多个会话共享相同数据的场景:当多个SqlSession需要共享相同的数据时,可以使用二级缓存来避免重复的数据库查询操作,提高系统性能。
  3. 减轻数据库的负载:在高并发的情况下,数据库可能会成为系统的瓶颈。通过使用二级缓存,可以减轻数据库的负载,提高系统的并发处理能力。

相关文章:

大厂面试真题-说一下Mybatis的缓存

首先看一下原理图 Mybatis提供了两种缓存机制&#xff1a;一级缓存&#xff08;L1 Cache&#xff09;和二级缓存&#xff08;L2 Cache&#xff09;&#xff0c;旨在提高数据库查询的性能&#xff0c;减少数据库的访问次数。注意查询的顺序是先二级缓存&#xff0c;再一级缓存。…...

jQuery UI 工作原理

jQuery UI 工作原理 引言 jQuery UI 是建立在 jQuery 库之上的一个开源 JavaScript 库,它提供了一系列用户界面交互、特效、小部件和主题。它旨在简化 HTML 用户界面的开发,使开发者能够轻松地创建具有丰富交互性和视觉吸引力的网页。本文将深入探讨 jQuery UI 的工作原理,…...

CS 工作笔记:SmartEdit 里创建的是 CMS Component

下图是在 SmartEdit 里创建的 cms Component&#xff0c;在 Back-Office 里的截图&#xff1a; SAP Commerce Cloud 的 CMS Component 是其内容管理系统 (CMS) 的核心组成部分&#xff0c;它提供了对在线商店或平台内容的灵活管理。通过这些组件&#xff0c;用户能够在不涉及复…...

Java面试经验总结之SSM框架+springboot

一、spring 1.Spring 是什么&#xff1f; 答&#xff1a;spring 是一个轻量级的容器框架&#xff0c; ioc 和 aop 是他的核心。spring 将传统的代码以来形式&#xff0c;变为从容器中获取&#xff0c;提高了开发效率&#xff0c;非常的方便。spring 衍生出了很多生态&#x…...

Unity 热更新(HybridCLR+Addressable)-设置打包路径和加载路径、打开Hosting服务、打包

四、设置打包和加载路径 五、打开Hosting服务 六、打包 打包完成后路径在Assets同级目录下的ServerData 但是目前没有资源文件对比 修改上面设置后再次打包 里面多了哈希和JSON文件&#xff0c;这俩个就是用于资源对比...

享元(轻量级)模式

简介 享元模式&#xff08;Flyweight Pattern&#xff09;又叫作轻量级模式&#xff0c;是对象池的一种实现。类似线程池&#xff0c;线程池可以避免不停地创建和销毁多个对象&#xff0c;消耗性能。享元模式提供了减少对象数量从而改善应用所需的对象结构的方式。其宗旨是共享…...

基于php的幸运舞蹈课程工作室管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码 精品专栏&#xff1a;Java精选实战项目…...

NLP任务的详细原理与步骤的详细讲解

1. 文本分类 原理&#xff1a; 特征提取&#xff1a;文本分类首先将文本转化为数值特征&#xff0c;常用方法包括词袋模型、TF-IDF、Word Embeddings&#xff08;如Word2Vec、GloVe&#xff09;和BERT等预训练模型。模型训练&#xff1a;模型&#xff08;如SVM、神经网络&…...

Kotlin 处理字符串和正则表达式(二十一)

导读大纲 1.1 处理字符串和正则表达式1.1.1 分割字符串1.1.2 正则表达式和三引号字符串1.1.3 多行三引号字符串IntelliJ IDEA 和 Android Studio 中三重引号字符串内部的语法高亮显示 1.1 处理字符串和正则表达式 Kotlin 字符串与 Java 字符串完全相同 可以将 Kotlin 代码中创建…...

一站式大语言模型API调用:快速上手教程

智匠MindCraft是一个强大的AI工具及开发平台&#xff0c;支持多种大语言模型和多模态AI模型。本文将详细介绍如何通过API调用智匠MindCraft中的大语言模型&#xff0c;帮助开发者快速上手。 注册与登录 访问智匠MindCraft官网&#xff0c;注册并登录账号。 进入开发者平台&…...

【TabBar嵌套Navigation案例-新特性页面-代码位置 Objective-C语言】

一、接下来,我们来说这个新特性页面 1.首先,看一下我们的示例程序,这里改一下,加一个叹号, command + R, 好,首先啊,这里边有一个新特性页面,当我这个程序是第一次安装、第一次运行、还有呢、就是当这个应用程序更新的时候,我应该去加载这个新特性页面, 然后呢,这…...

程序员如何提升并保持核心竞争力?——深入钻研、广泛学习与软技能的培养

一、引言  随着人工智能的不断发展&#xff0c;尤其是AIGC系列大语言模型的涌现&#xff0c;AI辅助编程工具正在日益普及&#xff0c;这对程序员的工作方式产生了深刻的影响。面对这一变革&#xff0c;程序员应如何应对&#xff1f;是专注于某个领域深耕细作&#xff0c;还是…...

Linux之Docker虚拟化部署

上传docker安装包 解压安装包 将解压后的docker文件夹移动到/usr/local/文件夹下 docker 启动命令/usr/local/docker/dockerd 但是启动报错&#xff0c;意思是没有docker用户组 创建docker用户组&#xff0c;执行完会生成套接字文件 将套接字文件加入该用户组管理 第二个错误原…...

重构部队信息安全:部队涉密载体建设新策略

一、完善保密体系架构 1. 加强保密规章制度&#xff1a;制定或刷新关于机密信息管理的相关规定&#xff0c;明确机密信息的生成、复制、传输、使用、储存及销毁等核心环节的操作准则与责任分配&#xff0c;确保整个流程的标准化运作。 2. 明确个人保密义务&#xff1a;通过保密…...

使用Node.js的readline模块逐行读取并解析大文件

在Node.js环境中处理大文件是一个常见的需求&#xff0c;尤其是在处理日志文件、数据库导出、或任何形式的大规模文本数据时。由于Node.js是基于事件循环和非阻塞I/O的&#xff0c;它非常适合处理这类任务。然而&#xff0c;直接将整个文件内容加载到内存中可能会导致内存溢出&…...

浅谈软件安全开发的重要性及安全开发实践

在当今数字化时代&#xff0c;软件已成为企业运营的核心驱动力。然而&#xff0c;随着网络环境的日益复杂和黑客技术的不断演进&#xff0c;软件安全问题日益凸显&#xff0c;成为企业不可忽视的重大挑战。本文将从法律法规要求、企业核心数据资产保护、企业信誉等角度&#xf…...

在 NodeJs 里面如何获取 APK 的名称和 icon

最近想用 electron 写一个 adb 的可视化客户端&#xff0c;在展示安装的应用时遇到了如何获取 APK 的名称和 icon 的问题。下面就是一些解决问题的思路。 前提&#xff1a;在这里默认大家已经下载好 apk, 下面 localApkPath 就是你下载好的 apk 的路径。 小提示&#xff0c;示…...

基于VirtualBox和Ubuntu的虚拟环境搭建

VirtualBox简介 VirtualBox 是一款开源虚拟机软件。 是由德国 Innotek 公司开发&#xff0c;由Sun Microsystems公司出品的软件&#xff0c;使用Qt编写&#xff0c;在 Sun 被 Oracle 收购后正式更名成 Oracle VM VirtualBox。简单易用&#xff0c;可虚拟的系统包括Windows&…...

【PHP源码】匿名来信系统H5版本V1.0免费开源

你的匿名来信H5一封你的来信源码/表白祝福短信程序/往来信/传话短信源码支持邮件发信与手机短信发信“你的匿名来信”是最近某音上爆火的一个活动话题&#xff0c;可以通过H5网站&#xff0c;编辑自己想要对某人说的话或者祝福&#xff0c;网站会把您想说的发给您预留的号码&am…...

Prompt技巧总结和示例分享

"Prompt"&#xff08;提示&#xff09;在人工智能中通常指的是输入给模型的文本&#xff0c;用于引导模型生成预期的输出。在使用人工智能助手时&#xff0c;有效的提示技巧可以帮助你获得更准确和有用的回答。 以下是一些单轮对话提示时的技巧&#xff1a; 明确具体…...

大厂校招:海能达嵌入式面试题及参考答案

SPI 协议的一些基础知识 SPI(Serial Peripheral Interface)即串行外设接口,是一种高速的、全双工、同步的通信总线。 SPI 主要由四根信号线组成: 时钟线(SCLK):由主设备产生,用于同步数据传输。时钟的频率决定了数据传输的速度。主设备输出 / 从设备输入线(MOSI):主…...

wrk(1) command

文章目录 1.简介2.特点3.格式4.选项5.示例参考文献 1.简介 wrk 是一个现代的 HTTP 压力测试工具&#xff0c;利用现代多线程技术和高效的网络 I/O 处理&#xff0c;能够生成大量的并发请求&#xff0c;用以测试 HTTP 服务器的性能。 它是作为一种更现代的压力测试工具而设计的…...

【小程序 - 大智慧】Expareser 组件渲染框架

目录 问题思考课程目标Web Component类型说明定义组件属性添加 Shadow DOMTemplate and SlotExparser 框架原理自定义组件内置组件 下周计划 问题思考 首先&#xff0c;给大家抛出去几个问题&#xff1a; 前端框架 Vue React 都有自己的组件库&#xff0c;但是并不兼容&#…...

vue + echarts 快速入门

vue echarts 快速入门 本案例即有nodejs和vue的基础&#xff0c;又在vue的基础上整合了echarts Nodejs基础 1、Node简介 1.1、为什么学习Nodejs(了解) 轻量级、高性能、可伸缩web服务器前后端JavaScript同构开发简洁高效的前端工程化 1.2、Nodejs能做什么(了解) Node 打破了…...

服务器几核几G几M是什么意思?如何选择?

服务器几核几G几M是什么意思&#xff1f;我们建站、搭建网络平台都要用到云服务器&#xff0c;不管在腾讯云、阿里云还是别的云服务平台选购&#xff0c;都会接触到服务器配置。云服务器就是把物理服务器&#xff08;俗称“母鸡”&#xff09;&#xff0c;用虚拟机技术虚拟出多…...

K8S服务发布

一 、服务发布方式对比 二者主要区别在于&#xff1a; 1、部署复杂性&#xff1a;传统的服务发布方式通常涉及手动配置 和管理服务器、网络设置、负载均衡等&#xff0c;过程相对复 杂且容易出错。相比之下&#xff0c;Kubernetes服务发布方式 通过使用容器编排和自动化部署工…...

Allen Institute for Artificial Intelligence (Ai2) 发布开源多模态语言模型 Molmo

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…...

Html CSS 布局,位置处理 居中 对齐

Html CSS 布局&#xff0c;位置处理 1、居中布局 1、div 让内部div居中对齐 html <div class"container"><div class"item">I am centered!</div> </div>style .container {border: 2px solid rgb(75, 70, 74);border-radius:…...

Spring MVC系统学习(二)——Spring MVC的核心类和注解

Spring MVC&#xff08;Model-View-Controller&#xff09;是Spring框架的一个模块&#xff0c;用于构建基于Web的应用程序。它使用模型、视图和控制器分离的设计模式&#xff0c;使得Web开发更加模块化和灵活。在学习Spring MVC时&#xff0c;有几个核心类和注解是非常关键的&…...

conda虚拟环境安装包、依赖同一管理

在 Python 的虚拟环境中&#xff0c;每个环境都是独立的&#xff0c;这意味着即使两个环境需要相同的库&#xff0c;它们也会分别安装各自的副本。这样做是为了避免不同项目之间相互影响&#xff0c;确保每个项目都有一个干净且隔离的环境。 方法一&#xff1a;使用 Conda 的共…...

淘宝上做网站靠谱吗/seo优化设计

Xing, HF, Li, JL, Hou, B, Zhang, YJ, Guo, MFJOURNAL OF SENSORS[1687-725X], Published 2017,收录情况&#xff1a; WOS-----------------------------------------------------------------张新喜,张嵘,郭美凤,程高峰,牛树来清华大学学报(自然科学版)[1000-0054], Publishe…...

2003系统建网站/友情链接网站

最近项目要涉及到粉丝关注问题&#xff0c;权衡再三还是使用Redis实现比较方便&#xff0c;使用Redis的有序集合可以做到根据关注的时间有序的取出列表&#xff0c;假设我的ID是me&#xff0c;别人的ID是other。 1. 添加关注 添加关注分为两步&#xff1a; 1、将对方id添加到自…...

小额贷款 网站模板/定制网站和模板建站

方法一&#xff1a;打印PDF表单以及在PDF中加入图片 需要的资料&#xff1a; jar包&#xff1a;iTextAsian.jar &#xff0c;itext-2.1.7.jar&#xff1b; 源码&#xff1a; 1 public static void main(String args[]) throws IOException, DocumentException {2 Strin…...

中山地区做网站公司/acca少女网课视频

工作过程中有时候会接收到数据库服务器器load 飙高的报警,比如:  load1 15.25 base: 8.52,collect time:2014-08-30  如何处理load 异常飙高的报警呢&#xff1f; 本文尝试从原理&#xff0c;原因&#xff0c;解决方法来阐述这类问题的解决思路。  一 原理分析  CPU作为…...

周口学做网站/网站之家

2019独角兽企业重金招聘Python工程师标准>>> 一、点击链接 https://natapp.cn/ 注册个免费的账户 NATAPP官网 二、登陆进去以后查看authtoken。复制这个&#xff0c;等下要在客户端用到&#xff01; 分配的authtoken 三、点击右侧配置&#xff0c;做一下配置&#x…...

企业如何推广网站/免费创建网站平台

LeetCode 637. 二叉树的层平均值 难度 简单 给定一个非空二叉树, 返回一个由每层节点平均值组成的数组。 示例 输入&#xff1a;3/ \9 20/ \15 7 输出&#xff1a;[3, 14.5, 11] 解释&#xff1a; 第 0 层的平均值是 3 , 第1层是 14.5 , 第2层是 11 。因此返回 [3, 1…...