首页 > 其他分享 >详细描述MyBatis缓存的实现原理?

详细描述MyBatis缓存的实现原理?

时间:2024-06-13 23:01:23浏览次数:13  
标签:缓存 一级 SqlSession 详细描述 二级缓存 MyBatis 查询

MyBatis 是一个优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解进行配置和映射原始类型、接口和 Java 的 POJO(Plain Old Java Objects,普通的Java对象)为数据库中的记录。

MyBatis 的一个重要特性就是它的缓存能力。通过缓存查询结果,MyBatis可以避免频繁地执行相同的查询,从而大大提高应用的性能。下面我们就来详细解释一下 MyBatis 缓存的工作原理。

1. MyBatis 支持两级缓存:一级缓存和二级缓存

  • 一级缓存:它指的是 SqlSession 级别的缓存。当我们执行查询时,查询结果会先被存储在 SqlSession 中的一个 map 中,如果我们再次执行相同的查询,MyBatis 会直接从这个 map 中获取结果,而不需要再次向数据库发送查询请求。这可以大大提高查询效率。然而,一级缓存的生命周期就是 SqlSession,当 SqlSession 被关闭,或者在执行 update、insert、delete 操作时(这些操作可能会改变数据库的数据,使得原来的查询结果变得无效),缓存将被清空。

  • 二级缓存:它指的是跨 SqlSessions 的缓存,其生命周期是整个应用程序,只要应用不关闭,这个缓存就不会清空。二级缓存可以被多个 SqlSessions 共享。二级缓存使用了一个 Java 的引用对象,保证了只要在程序的其他地方还有对对象的引用,那么这个缓存就不会被垃圾回收器回收。

2. 缓存的实现原理

  • 一级缓存基本的工作原理是,当 SqlSession 生成并提交给用户使用时,我们从 SqlSession 发出的每一条 SQL 语句以及它的参数,都会被当作是这个缓存的一个键值对,键为 SQL 语句及参数,值则是查询出的结果。

  • 二级缓存的原理类似,只不过它的作用范围更广,它会跨 SqlSessions。二级缓存是以 Mapper(对应一个 XML 文件或一个 Mapper 接口)级别来工作的,也就是说,对于同一个 Mapper,无论是不是同一个 SqlSession,它查询出的数据都会被缓存到二级缓存中。

3. 使用缓存的考量

使用缓存可以提高我们的应用的性能,但是无论是一级缓存还是二级缓存,由于它们的生命周期和作用范围都不同,我们在使用的时候需要carefully考虑:

在 MyBatis 中,二级缓存提供了可插拔的策略,FIFO(先进先出), SOFT(软引用), WEAK(弱引用)和 LRU(最少使用)等,可以根据实际应用的需要选择合适的策略。

缓存并非万能药,尤其在分布式环境下使用 MyBatis 二级缓存时需要格外注意。因为在分布式系统中,一份缓存数据可能会被多台服务器上的多个SqlSession访问,这就可能出现脏读的情况。所以在分布式系统中,更推荐使用 Redis 等分布式缓存。

  • 缓存中的数据可能会过期,也就是说,数据库中的数据可能会变化,但是缓存中的数据却没有被更新。这种情况下,如果我们直接使用了缓存中的数据,那么可能会造成数据的一致性问题。

  • 二级缓存,如果在多线程环境下,可能会引发线程安全问题。

  • 深入了解一下 MyBatis 缓存的工作过程和使用策略:

  •  

    1. 启用和配置缓存

  • 一级缓存:一级缓存是 MyBatis 自动开启的,无需进行任何配置,只要你使用的是同一个 SqlSession 进行数据库操作,那么一级缓存总是存在的。

  • 二级缓存:要启用二级缓存,首先你需要在你的 MyBatis 主配置文件中添加一行配置 <setting name="cacheEnabled" value="true"/>,然后在你的映射文件中添加 <cache/> 标签。

  • 一级缓存:每当 SqlSession 执行了任何一种更新操作(包括添加、修改、删除),或者是调用了 commit()close(),及 clearCache() 方法,那么 SqlSession 就会清空一级缓存。

  • 二级缓存:二级缓存只有在调用 commit() 或 close() 方法时,才会将数据写入到二级缓存中。并且只有在开启了一个新的 SqlSession, 且查询的是同一个映射文件中的 SQL 语句,这时候 MyBatis 才会在查询之前去二级缓存中查找数据。所以如果你在同一个 SqlSession 中,先后两次查询了同一条 SQL 语句,则第二次查询实际上还是会走数据库,不会走二级缓存。

标签:缓存,一级,SqlSession,详细描述,二级缓存,MyBatis,查询
From: https://blog.csdn.net/liangzai215/article/details/139666179

相关文章

  • 使用MyBatis的注意事项有哪些
    这篇文章给大家分享的是有关使用MyBatis的注意事项有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、MyBatis的HelloWord1.根据xml配置文件(全局配置文件mybatis-config.xml)创建一个SqlSessionFactory对象有数据源一些运行环境信息<?xml ve......
  • MyBatis之工作原理,简单CRUD,一篇让你明白原理
    一、MyBatis之工作原理MyBatis是一个半自动映射框架。所谓半自动,是相对Hibernate全表映射而言的,MyBatis需要手动匹配提供POJO、SQL和映射关系。我们知道,jdbc有四个核心对象(1)DriverManager,用于注册数据库连接(2)Connection,与数据库连接对象(3)Statement/PrepareStatement,操作数......
  • WordPress、Typecho 站点如何让 CloudFlare 缓存加速
    众所周知WordPress、Typecho都是著名动态博客站点(一个最简单的判断依据就是都要依赖结合数据库),这类站点在CDN缓存上都有一个致命的缓存弊端就是动静态请求的区分,理论上要让CDN绕过所有的动态请求,缓存所有的静态请求,否则就会造成前端登录和非登录状态的混乱,影响用户浏览体......
  • MyBatis 的在使用上的注意事项及其辨析
    1.MyBatis的在使用上的注意事项及其辨析@目录1.MyBatis的在使用上的注意事项及其辨析2.准备工作3.#{}与${}的区别和使用{}3.1什么情况下必须使用$3.1.1拼接表名3.1.2批量删除3.1.3模糊查询3.1.3.1使用${}的方式3.1.3.2使用#{}的方式4.typeAliases别名定......
  • MyBatis-Plus更新字段为null时,update语句为null字段不生效的解决方法
    MyBatis-Plus更新字段为null时,update语句为null字段不生效的解决方法https://blog.csdn.net/y2020520/article/details/1328272061)修改MyBatis-Plus全局默认策略缺点:这样做会对所有的字段都忽略判断,如果一些字段不想要修改,但是传值的时候没有传递过来,就会被更新为nullmybatis-p......
  • 自定义MyBatis插件
    插件原理回顾在前面,我们通过MyBatis插件机制介绍与原理分析了MyBatis插件的基本原理,但是可能还只是理论上的分析,没有实战的锻炼可能理解的还是不够透彻。接下来,我们通过自定义插件实例来进一步深度理解MyBatis插件的插件机制。插件接口MyBatis插件接口-Interceptor有......
  • linux清理缓存
    当cache缓存占用太大,服务起不来,需要查看清理缓存执行free-m或者free-h,查看缓存释放缓存区内存的方法(请注意,以下操作需要root权限)建议在清理缓存之前先备份重要数据,以免发生意外情况。1、清理磁盘缓存刷新文件系统缓存,将缓存中的数据写入磁盘。sync清理页缓存。这将清......
  • 动态选择4种库存更新策略+缓存预热+多级存储结构——应对高并发秒杀情景和其他多种情
    商城整体功能架构图文字分析:活动入口进行风控检测,这个使用独立的服务来实现,风控使用批量提交的形式来实现,直接运用Java线程池来实现,可以提交一个列表来实现批量,可以参考以下的代码创建批量请求并且进行提交:importjava.util.ArrayList;importjava.util.List;publi......
  • 初始MyBatis ,详细步骤运行第一个MyBatis程序,同时对应步骤MyBatis底层剖析
    1.初始MyBatis,详细步骤运行第一个MyBatis程序,同时对应步骤MyBatis底层剖析@目录1.初始MyBatis,详细步骤运行第一个MyBatis程序,同时对应步骤MyBatis底层剖析每博一文案2.前沿知识2.1框架(framework)2.2三层架构2.3分析JDBC的缺点3.初始了解MyBatis4.MyBatis第一个入门程......
  • 在 Wed 中应用 MyBatis(同时使用MVC架构模式,以及ThreadLocal 事务控制)
    1.在Wed中应用MyBatis(同时使用MVC架构模式,以及ThreadLocal事务控制)@目录1.在Wed中应用MyBatis(同时使用MVC架构模式,以及ThreadLocal事务控制)2.实现步骤:1.第一步:环境搭建2.第二步:前端页面index.html3.第三步:创建pojo包、service包、dao包、web包、utils包,exceptions......