MyBatis 的多级缓存机制是怎么样运作的?

引言:上周三,小 X 去面试一家中厂,其中面试官问到 MyBatis 的多级缓存机制是怎么样运行的?这个问题可以好好准备一下,很多人可能只会用 MyBatisPlus,简单的多表联查 SQL 语句可能都写不出来,更别说索引优化、SQL 语句优化、安全漏洞等问题了,先打好基础,才能更好地学习。

题目

MyBatis 的多级缓存机制是怎么样运作的?

推荐解析

一级缓存

1)MyBatis 的一级缓存默认开启,且默认作用范围为 SESSION,即一级缓存在一个会话中生效,也可以通过配置将作用范围设置为 STATEMENT,让一级缓存仅针对当前执行的 SQL 语句生效。
2)在同一个会话中,执行增,删,改操作会使本会话中的一级缓存失效。
3)不同会话持有不同的一级缓存,本会话内的操作不会影响其它会话内的一级缓存。

Session 针对浏览器会话,不同会话的同一个 SQL 语句,自然是不会走一级缓存。同一个浏览器会话,但是查询条件不同,比如 Where 条件不同,依然不会走一级缓存,或者同一个浏览器在两个相同的查询条件下,中间执行了一次增、删、改的操作,一级缓存依然失效。

**特别注意:**一级缓存针对的范围是什么?以及一级缓存失效的场景,当然一般我们都会在 yml 配置中去开启日志,通过查看日志可以看到缓存是否被使用!

二级缓存

1) MyBatis 中的二级缓存默认开启,可以在 MyBatis 配置文件中的<settings>中添加<setting name="cacheEnabled" value="false"/>将二级缓存关闭;
2)MyBatis 中的二级缓存作用范围是同一命名空间下的多个会话共享,这里的命名空间就是映射文件的 namespace,即不同会话使用同一映射文件中的 SQL 语句对数据库执行操作并提交事务后,均会影响这个映射文件持有的二级缓存;
3)MyBatis 中执行查询操作后,需要提交事务才能将查询结果缓存到二级缓存中;
4)MyBatis 中执行增,删或改操作并提交事务后,会清空对应的二级缓存;
5)MyBatis 中需要在映射文件中添加<cache>标签来为映射文件配置二级缓存,也可以在映射文件中添加<cache-ref>标签来引用其它映射文件的二级缓存以达到多个映射文件持有同一份二级缓存的效果。

二级缓存配置项

在 Mapper 配置文件中添加的 Cache 标签中可以设置相关属性。

1)Eviction 属性:缓存回收策略(LRU、FIFO、SOFT、WEAK)

2)FlushInterval属性:刷新间隔,单位毫秒,默认没有刷新间隔,语句被调用时缓存会刷新。

3)Size:引用的数目,缓存存储的对象数量,考虑到内存溢出问题。

4)ReadOnly:只读,是否是只读缓存,如果为 true,所有调用者返回缓存对象的相同实例。如果为 false,会返回缓存对象的拷贝(序列化对象),性能慢,但安全性高,默认为 false。

是否需要三级缓存?

概念:三级缓存通常指的是在分布式系统中,跨应用实例的缓存层,如使用 Redis 或 Memcached 作为缓存存储。

作用:三级缓存可以进一步减少对数据库的访问,提高系统的扩展性和性能。

考虑因素:是否需要三级缓存取决于应用的规模、架构和性能需求。如果应用部署在多个服务器上,且需要共享数据,可能需要考虑引入三级缓存。

实现:三级缓存通常不是由 MyBatis 直接提供,而是通过集成外部缓存系统来实现。

应用规模:对于大型应用或分布式系统,三级缓存可以提供更好的性能和扩展性。

性能需求:如果应用对性能有较高要求,尤其是在高并发场景下,三级缓存可以显著减少数据库的压力。

数据一致性:引入三级缓存需要考虑数据一致性问题,确保缓存与数据库之间的数据同步。

复杂性:实现三级缓存可能会增加系统的复杂性,需要权衡实现成本和性能收益。

其他补充

鱼聪明 AI 的回答:

鱼聪明 AI 地址:https://www.yucongming.com/

一级缓存示例:

一级缓存是自动启用的,不需要额外配置。它通常在 SqlSession 的生命周期内有效。

// 获取 SqlSession
SqlSession session = sqlSessionFactory.openSession();

try {
    // 查询用户,一级缓存会自动存储这个查询结果
    User user1 = session.selectOne("com.example.mapper.User.selectById", 1L);

    // 再次查询相同的用户,这次将从一级缓存中获取结果
    User user2 = session.selectOne("com.example.mapper.User.selectById", 1L);

    // 检验缓存是否失效:在一级缓存中,可以通过比较 user1 和 user2 是否相同来检验
    if (user1 == user2) {
        System.out.println("一级缓存有效");
    } else {
        System.out.println("一级缓存失效");
    }

} finally {
    session.close(); // 关闭 SqlSession,结束一级缓存的生命周期
}

二级缓存示例:

二级缓存需要在 MyBatis 配置文件中配置,并在 Mapper 接口上使用 @CacheNamespace 注解。

<!-- mybatis-config.xml -->
<configuration>
    <settings>
        <!-- 启用二级缓存 -->
        <setting name="cacheEnabled" value="true"/>
    </settings>
    
    <!-- 配置二级缓存的类型,这里使用 MyBatis 内置的 PerpetualCache -->
    <cache type="org.apache.ibatis.cache.impl.PerpetualCache">
        <!-- 二级缓存的大小限制 -->
        <property name="size" value="1024"/>
    </cache>
</configuration>
// 在 Mapper 接口上使用 @CacheNamespace 注解
@CacheNamespace
public interface UserMapper {
    User selectById(Long id);
}
// 使用二级缓存的示例
SqlSession session = sqlSessionFactory.openSession();

try {
    // 查询用户,结果将被存储在二级缓存中
    User user1 = session.getMapper(UserMapper.class).selectById(1L);

    // 关闭当前会话,然后重新打开一个新的会话
    session.close();
    session = sqlSessionFactory.openSession();

    // 在新的会话中再次查询相同的用户,这次将从二级缓存中获取结果
    User user2 = session.getMapper(UserMapper.class).selectById(1L);

    // 检验缓存是否失效:在二级缓存中,可以通过比较 user1 和 user2 是否相同来检验
    if (user1 == user2) {
        System.out.println("二级缓存有效");
    } else {
        System.out.println("二级缓存失效");
    }

} finally {
    session.close(); // 关闭 SqlSession
}

检验缓存是否失效:

  • 一级缓存:由于一级缓存仅在 SqlSession 的生命周期内有效,通常不需要手动检验缓存是否失效。当 SqlSession 关闭时,一级缓存自动失效。
  • 二级缓存:可以通过比较两次查询返回的对象引用是否相同来检验缓存是否失效。如果相同,说明缓存有效;如果不同,说明缓存可能已经失效。

欢迎交流

本文主要介绍 MyBatis 的一二级缓存和缓存失效的主要场景,以及是否需要三级缓存的问题,关于数据库方面是一个重点项,因为不同语言都需要利用数据库进行持久化存储,无论哪种 ORM 框架都有各自的优缺点,需要根据实际场景进行选择,在文末还有三个提问,欢迎小伙伴在评论区进行留言!近期面试鸭小程序已全面上线,想要刷题的小伙伴可以积极参与!

1)一级缓存和二级缓存的区别是什么?

2)如何配置和管理二级缓存?

3)MyBatis的一级缓存是如何工作的?它的生命周期是什么时候开始和结束的?什么情况下会导致一级缓存的失效或刷新?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/713734.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

神经网络 torch.nn---nn.LSTM()

torch.nn - PyTorch中文文档 (pytorch-cn.readthedocs.io) LSTM — PyTorch 2.3 documentation LSTM层的作用 LSTM层:长短时记忆网络层&#xff0c;它的主要作用是对输入序列进行处理&#xff0c;对序列中的每个元素进行编码并保存它们的状态&#xff0c;以便后续的处理。 …

python-求分数序列和

[题目描述]&#xff1a; 输入&#xff1a; 输入一行一个正整数n(n≤30)。输出&#xff1a; 输出一行一个浮点数&#xff0c;表示分数序列前n 项的和&#xff0c;精确到小数点后4位。样例输入1 2 样例输出1 3.5000 来源/分类&#xff08;难度系数&#xff1a;一星&#xff09;…

Android集成高德天气API 天气预报

1.新建工程项目WeatherForecast。 2.在AndroidManifest文件中添加网络访问相关权限。 <uses-permission android:name"android.permission.INTERNET"/> 3.设计页面布局activity_main.xml&#xff0c;界面效果如图所示。 4.注册高德开放平台&#xff0c;查阅…

【AI实践】Ollama本地安装大模型服务

Ollama安装运行 安装与配置 Download Ollama 安装默认在C盘&#xff0c;成功后&#xff0c;window任务栏图标会有Ollama Logo 为了不占用C盘更大的空间&#xff0c;修改模型下载路径&#xff0c;修改环境变量 下载模型 由于我电脑是第六代Intel&#xff0c;集显&#xff0c;…

页面置换算法的模拟实现

一. 实验内容 1. 假设某一个进程&#xff0c;在运行过程中需要访问的内容依次在320个地址中。为了模拟产生320个地址的值。首先实现在main函数中调用下面的函数随机产生320个地址的地址序列。 #include<unistd.h> void randarray(int a[],int k) { int i; float s;…

2024年大数据领域的主流分布式计算框架有哪些

Apache Spark 适用场景 以批处理闻名&#xff0c;有专门用于机器学习的相关类库进行复杂的计算&#xff0c;有SparkSQL可以进行简单的交互式查询&#xff0c;也可以使用DataSet&#xff0c;RDD&#xff0c;DataFrame进行复杂的ETL操作。 关键词 处理数据量大批计算微批计算…

[Qt的学习日常]--常用控件1

前言 作者&#xff1a;小蜗牛向前冲 名言&#xff1a;我可以接受失败&#xff0c;但我不能接受放弃 如果觉的博主的文章还不错的话&#xff0c;还请点赞&#xff0c;收藏&#xff0c;关注&#x1f440;支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 目录 一、什么是控…

【2024亲测无坑】Oracle--19C在Centos7上的静默安装(rpm版)

一、Oracle 19c Linux安装&#xff08;Centos 7&#xff09; 1.查看磁盘可用空间及配置ip地址 [rootlocalhost /]# df -h 文件系统 容量 已用 可用 已用% 挂载点 devtmpfs 1.4G 0 1.4G 0% /dev tmpfs 1.4G …

进程信号(下)

上文&#xff1a;进程信号&#xff08;上&#xff09;-CSDN博客 在上篇中&#xff0c;我们讲了关于信号的保存&#xff0c;信号集的操作&#xff0c;那么这篇我们就来看看信号的原理。 目录 1. 键盘产生信号的原理 2. 信号是如何被处理的&#xff1f; 2.1 信号处理的原理 …

深度神经网络——深度学习中的 RNN 和 LSTM 是什么?

引言 自然语言处理和人工智能聊天机器人领域许多最令人印象深刻的进步都是由 递归神经网络&#xff08;RNN&#xff09; 和长短期记忆&#xff08;LSTM&#xff09;网络。 RNN 和 LSTM 是特殊的神经网络架构&#xff0c;能够处理顺序数据&#xff0c;即按时间顺序排列的数据。…

实用软件下载:会声会影2023最新安装包及详细安装教程

会声会影2023的智能工具&#xff0c;使用AI面部识别对效果最好的照片和视频片段进行分析&#xff0c;提取&#xff0c;并编译到可以项目中&#xff0c;将我们的精彩时刻、美好回忆和媒体内容转换为影片。 全新的AR贴纸让视频更具感染力和趣味性&#xff0c;AR贴纸功能可以识别并…

python 实现各种数据分析方法

1、相关性分析 1.1、https://zhuanlan.zhihu.com/p/669355778https://zhuanlan.zhihu.com/p/669355778

Jacob环境探索(兼容性、管理员、DLL位置、VS环境,COM权限)

概述&#xff1a; 最近在生产开发实践出现了很多问题&#xff0c;经过了一系列排查&#xff0c;特做如下总结 探索成果&#xff1a; 1. jacob.dll的建议位置 首先jacob的官网&#xff0c;以及官方GitHub&#xff0c;你可以从这里找到DLL文件&#xff0c;以及相关资料然后DLL文…

WordPress——Argon主题美化

文章目录 Argon主题美化插件类类别标签页面更新管理器文章头图URL查询监视器WordPress提供Markdown语法评论区头像设置发信设置隐藏登陆备份设置缓存插件 主题文件编辑器页脚显示在线人数备案信息(包含备案信息网站运行时间)banner下方小箭头滚动效果站点功能概览下方Links功能…

GitHub Copilot 登录账号激活,已经在IntellJ IDEA使用

GitHub Copilot 想必大家都是熟悉的&#xff0c;一款AI代码辅助神器&#xff0c;相信对编程界的诸位并不陌生。 今日特此分享一项便捷的工具&#xff0c;助您轻松激活GitHub Copilot&#xff0c;尽享智能编码之便利&#xff01; GitHub Copilot 是由 GitHub 和 OpenAI 共同开…

38、基于卷积神经网络(CNN)的车牌自动识别系统(matlab)

1、原理及流程 1&#xff09;原理 CNN&#xff08;卷积神经网络&#xff09;是一种深度学习模型&#xff0c;可以用于图像识别和分类任务。车牌自动识别系统的原理基本上就是使用CNN模型对车牌图像进行处理和识别。 首先&#xff1a;系统需要收集大量的含有车牌的图像数据作…

windows系统,家庭自用NAS。本地局域网 Docker安装nextcloud

windows系统&#xff0c;家庭自用NAS。本地局域网 Docker安装nextcloud 1、docker安装 太简单了&#xff0c;直接去搜一搜。 docker-compose 相关命令 docker-compose down docker compose up -d2、还是使用老的 在你需要挂载的目录下&#xff0c;新建一个文件&#xff0c;…

航顺MCU概览

前言: 截止2023年底,全国有3451家芯片设计公司,已经IPO的就有168家,尚未IPO的3283家中超过一半的年营收在1000万以下,迅猛发展的几年的确有些国产芯片开始站上赛道,这也是国际大背景下的一种必然选择,毕竟突然间出现的大市场需要国产顶上,但资本市场是周期性的,国产替…

港科夜闻 | 香港科大与香港科大(广州)合推红鸟跨校园学习计划,共享教学资源,促进港穗学生交流学习...

关注并星标 每周阅读港科夜闻 建立新视野 开启新思维 1、香港科大与香港科大(广州)合推“红鸟跨校园学习计划”&#xff0c;共享教学资源&#xff0c;促进港穗学生交流学习。香港科大与香港科大(广州)6月14日共同宣布推出“红鸟跨校园学习计划”&#xff0c;以进一步加强两校学…

transformer和Non-local

两者本质上是一个东西&#xff0c;都是用来求自注意力的&#xff0c;但具体而言还是有一些差别&#xff1b; 1&#xff1a;首先说Non-local&#xff0c;它是像素级别的self-attention,算的是图片中各个像素点对指定像素点的影响&#xff1b; 2&#xff1a;transformer我们拿s…