首页 > 编程语言 >高级java每日一道面试题-2025年01月16日-框架篇[Mybatis篇]-说说Mybatis的缓存机制?

高级java每日一道面试题-2025年01月16日-框架篇[Mybatis篇]-说说Mybatis的缓存机制?

时间:2025-01-17 18:29:04浏览次数:3  
标签:面试题 缓存 二级缓存 查询 MyBatis SqlSession 01 Mybatis 失效

如果有遗漏,评论区告诉我进行补充

面试官: 说说Mybatis的缓存机制?

我回答:

在Java高级面试中,MyBatis的缓存机制是一个重要的话题。MyBatis是一个流行的Java持久化框架,它提供了强大的数据库访问能力和灵活的SQL映射配置。为了提高查询性能并减少数据库访问次数,MyBatis引入了缓存机制。下面将对MyBatis的缓存机制进行详细解释:

MyBatis缓存机制概述

MyBatis的缓存机制主要分为一级缓存和二级缓存。这两种缓存机制共同协作,以提高数据库的查询效率。

一级缓存

  1. 定义与特点

    • 一级缓存是SqlSession级别的缓存。
    • 它默认开启且不可关闭。
    • 每个SqlSession都有自己独立的缓存区域,缓存的生命周期与SqlSession一致。
  2. 工作原理

    • 当使用SqlSession进行查询时,如果下一次再使用相同的SqlSession进行查询,并且查询条件完全相同(包括SQL语句和参数),就会直接从缓存中取数据,而不是再次访问数据库。
    • 当执行增删改操作(insert、update、delete)时,会清空一级缓存,因为增删改操作可能会改变数据库中的数据,为了保证数据的一致性,需要清空缓存。
    1. 打开 SqlSession:当 SqlSession 被打开时,使用 CacheExecutor 包装 Executor
    2. 执行查询:当执行查询时,CacheExecutor 首先检查二级缓存是否有匹配的结果。
    3. 命中缓存:如果有匹配的结果,则直接返回缓存中的数据。
    4. 未命中缓存:如果没有匹配的结果,则执行 SQL 查询,并将结果放入二级缓存。
    5. 关闭 SqlSession:当 SqlSession 关闭时,二级缓存仍然存在,可供其他 SqlSession 使用。
  3. 失效情况

    • 当SqlSession被关闭、提交或回滚时,一级缓存将失效。
    • 执行了任何增删改操作后,一级缓存也会被清空。
    • 如果查询语句不同或查询参数不同,一级缓存不会命中。

二级缓存

  1. 定义与特点

    • 二级缓存是Mapper级别的缓存。
    • 它可以跨SqlSession共享数据。
    • 二级缓存默认是关闭的,需要手动配置才能启用。
    • 二级缓存适用于更大范围的数据共享,但由于缓存生命周期较长,可能导致缓存不一致问题。
  2. 工作原理

    • 在mapper.xml文件中添加<cache/>标签或在mapper接口上使用@CacheNamespace注解来启用二级缓存。
    • 当查询结果被存储在二级缓存中时,其他SqlSession可以直接从二级缓存中获取结果,而不需要再次访问数据库。
    • 执行了增删改操作后,相关的二级缓存会失效。
  3. 配置与启用

    • 在mapper.xml文件中添加<cache/>标签来开启二级缓存。
    • 对于使用注解的mapper,在接口上使用@CacheNamespace注解也可以启用二级缓存。
    • 可以配置缓存的回收策略、刷新间隔、缓存大小等参数,以适应不同的业务需求。
  4. 注意事项

    • 使用二级缓存时,POJO类必须实现Serializable接口,因为二级缓存可能会将对象序列化到磁盘上。
    • 二级缓存是线程共享的,因此需要考虑线程安全问题。

缓存的刷新与失效策略

  1. 缓存刷新

    • 执行增删改操作后,相关的缓存会失效,以确保数据的一致性。
    • 可以配置缓存的刷新间隔,以定期刷新缓存。
  2. 失效策略

    • 除了增删改操作会导致缓存失效外,缓存的失效策略还包括LRU(最近最少使用)、FIFO(先进先出)等算法,这些算法可以根据缓存的使用情况来自动失效部分缓存。

最佳实践

  1. 合理使用缓存:根据业务需求决定是否启用缓存,避免不必要的缓存开销。
  2. 控制缓存范围:仅对读多写少的数据启用缓存,对于频繁更新的数据应禁用缓存。
  3. 定期清理缓存:在适当的时候手动清理缓存,以保持数据一致性。
  4. 监控缓存命中率:通过日志或监控工具监控缓存命中率,优化缓存策略。
  5. 分布式缓存:对于分布式系统,考虑使用 Redis 或 Memcached 等外部缓存系统。

综上所述,MyBatis的缓存机制包括一级缓存和二级缓存。一级缓存是SqlSession级别的缓存,默认开启且不可关闭;二级缓存是Mapper级别的缓存,需要手动配置才能启用。通过合理配置和使用这两种缓存机制,可以显著提高数据库的查询效率并减少数据库访问次数。

标签:面试题,缓存,二级缓存,查询,MyBatis,SqlSession,01,Mybatis,失效
From: https://blog.csdn.net/qq_43071699/article/details/145172757

相关文章

  • 2025年01月17日Github流行趋势
    项目名称:MiniCPM-o项目地址url:https://github.com/OpenBMB/MiniCPM-o项目语言:Python历史star数:14181今日star数:371项目维护者:yiranyyu,iceflame89,yaoyuanTHU,LDLINGLINGLING,tc-mb项目简介:MiniCPM-o2.6:一个支持视觉、语音和多模式直播的GPT-4o级别大型语言模型......
  • MiniMax TTS新模型T2A-01-HD:情感控制10秒克隆限时免费;真人表演+文本命令,Kinetix精准生
      开发者朋友们大家好: 这里是**「RTE开发者日报」**,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享RTE(Real-TimeEngagement)领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「有看点的会议」,但内容仅代表编......
  • Linux基础-指令篇01【入门级】
    工具安装需要用到VMware,大家自行安装,如果有需要后续会上传相关文件和详细安装步骤嵌入式系统专业定义:以应用为中心,以计算机技术为基础,软硬件可裁剪,对功能,可靠性,成本,体积,功耗等严格要求的专用计算机系统。简单理解:除了pc和一些高级的控制台之外,绝大多数的控制类设备都是嵌......
  • 2025-01-17:构成整天的下标对数目Ⅰ。用go语言,给定一个整数数组 hours,其中每个元素表示
    2025-01-17:构成整天的下标对数目Ⅰ。用go语言,给定一个整数数组hours,其中每个元素表示以小时为单位的时间,要求返回一个整数,表示满足条件i<j且hours[i]+hours[j]为24的整数倍的下标对(i,j)的数量。这里,整天被定义为时间持续的时长是24小时的整数倍。例如,1天......
  • 01背包的推导
    1.二维背包容量为7,总共有四件物品,价值和重量表示为{v,w},它们的价值和重量分别是1{2,3},2{5,5},3{1,1},4{9,3},求背包最多能装多少开始推导:能装i个物品并选取前i个物品,背包容量为j。dp[1][1]=0,显然是0,因为物品1的重量为3,你装答辩啊。dp[1][2]=0,容量不够还是不行。dp[1][3]=2,背包的容......
  • 三层24千兆+4万兆光电可选网管型嵌入式交换机核心模块SW-24G4F-301EM
    先来解读一下标题,这是一款交换机核心模块,也就是交换机的核心部分模块化了;方便为了嵌入式集成;是管理型(也就是核心模块带了软件,对应底板结合自身板框,根据参考设计随性设计),还是三层管理;可以最多支持28个通信口,分别是24千兆+4万兆,接口的方式可以电口,也可以光口。可广泛应用于煤......
  • SQL-按自定义格式进行编号的SQL自定义函数.090119
    生成格式如:DT.EMP.0000000001的自增emp_id,加入EmpBaseINfo表中。--生成格式如DT.EMP.0000000001  【Vegas Add】ALTERFUNCTION[dbo].[Get_EmpBaseInfo_AccountID](@RowIDasint)RETURNSnvarchar(50) as begin    declare@oidnvarchar(50)    dec......
  • windows安装tomcat10.240108
    ​下载安装jdk17:jdk-17_windows-x64_bin.exe配置JAVA环境变量JAVA_HOME:C:\ProgramFiles\Java\jdk-17PATH:%Java_Home%\bin;%Java_Home%\jre\bin;拷贝tomcat10(下载地址:https://tomcat.apache.org/)到目录,设置环境变量CATALINA_HOME:D:\apache-tomcat-10.1.12PATH:%CATALINA......
  • 挖矿病毒的终极解决方法.201010
    1,编写sh脚本:rm_wk.sh#!/bin/bashPATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/binexportPATHkill-9$(ps-ef|grepkdevtmpfsi|grep-vgrep|awk'{print$2}')kill-9$(ps-ef|grepkinsing|grep-vgrep|awk'{pri......
  • Java初学者笔记-01、封装继承多态
    封装:封装是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。通过封装,可以将类的信息隐藏在类内部,只暴露对外的接口(如setter和getter方法),从而提高代码的安全性和可维护性。继承:继承是从已有的类中派生出新的类的过程。新的类(子类)能够吸收已有类(父类)的数据属性和行为,并且可以......