当前位置: 首页 > 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 的性能,减少不必要的数据库查询操作。

http://www.lryc.cn/news/504218.html

相关文章:

  • [2024-12 CISCN 长城杯] Crypto
  • pytorch bilstm crf的教程,注意 这里不支持批处理,要支持批处理 用torchcrf这个。
  • Python毕业设计选题:基于django+vue的疫情数据可视化分析系统
  • tomcat被检测到目标URL存在htp host头攻击漏洞
  • 1.初识python
  • 【密码学】ZUC祖冲之算法
  • Python面试常见问题及答案8
  • ASP.net Core EntityFramework Code EF code 汇总
  • u3d动画系统五【StateMachineBehaviour类】
  • IS-IS协议
  • 使用C++实现RSA加密解密
  • C++归并与快速
  • 金蝶云苍穹踩过的坑(慢慢更新)
  • AndroidStudio——安卓项目结构与文件介绍
  • 华为自反ACL实验
  • yml和xml分别代表什么
  • Qt多线程编程
  • springboot438校园志愿者管理系统(论文+源码)_kaic
  • PostgreSQL 常用运维SQL整理
  • Debezium Oracle CTAS 解析器实现:基于 ANTLR 的 CREATE TABLE AS SELECT 语句解析
  • 从零开始学docker(五)-可用的docker镜像
  • 力扣——322. 零钱兑换
  • .Net_比对Json文件是否一致
  • 科研笔记:ARR 与 ACL rolling
  • 【2024】Camunda常用功能基本详细介绍和使用-上 (1)
  • 用人话讲计算机:Python篇!(十二)正则运算+re模块
  • 使用create-react-app创建工程时报错处理
  • C# 探险之旅:第三十五节 - 类型class之抽象类 (Abstract Class) 和 抽象方法 (Abstract Method)
  • qt-C++笔记之父类窗口、父类控件、对象树的关系
  • Cisco Packet Tarcer配置计网实验笔记