Mybatis中一级缓存与二级缓存详细介绍

Mybatis缓存的介绍

MyBatis 是一款优秀的持久层框架,它提供了缓存功能来减少数据查询时的数据库交互次数,从而提高查询性能。MyBatis 的缓存分为一级缓存和二级缓存两种类型。

MyBatis缓存原理

MyBatis 的缓存本质上是一个 HashMap,它的键是查询语句和参数的组合,值是查询结果。当我们执行一个查询时,MyBatis 会先从缓存中查找对应的查询结果,如果缓存中存在,则直接返回缓存的结果;如果缓存中不存在,则从数据库中查询数据,并将查询结果存入缓存中。
每个 SqlSession 都有自己的缓存,因此在不同的 SqlSession 中执行同一个查询语句,它们所使用的缓存是不同的。同时,MyBatis 的缓存是基于引用计数的机制实现的,当查询语句被多次引用时,缓存的引用计数会加 1,只有当引用计数为 0 时,缓存才会被真正的清除。

一级缓存

定义

  一级缓存(Level 1 Cache),简称L1 Cache,位于CPU内核的旁边,是与CPU结合最为紧密的CPU缓存。它通常只有几十KB大小,访问速度非常快,通常只需要几个周期。由于一级缓存的技术难度和制造成本最高,因此提高容量所带来的技术难度增加和成本增加非常大,而且性价比很低。现有的一级缓存的命中率已经很高,所以一级缓存是所有缓存中容量最小的。

应用场景

1.数据库查询操作:在数据库查询操作中,一级缓存可以提高查询效率。例如,在MyBatis这样的Java持久层框架中,一级缓存(也称为本地缓存)基于SqlSession进行工作。当在同一个SqlSession中执行相同的SQL查询时,MyBatis会首先检查一级缓存。如果缓存中已经存在相同的查询结果,就直接返回缓存中的数据,而不会再次向数据库发出查询请求。这大大减少了数据库访问次数,降低了数据库的负担,提高了查询的响应速度。
2.Java程序运行:在Java程序运行中,一级缓存可以显著减少内存读取时间,提高程序执行效率。

不适合场景

高并发环境:在高并发的应用场景下,多个SqlSession可能同时对同一数据进行查询和修改。由于一级缓存是基于SqlSession的,不同的SqlSession之间无法共享缓存数据,这可能导致大量的重复查询和数据不一致的问题。
频繁的数据修改:当数据被频繁修改时,一级缓存中的数据会很快变得过时。由于一级缓存不会自动刷新,除非执行了增删改操作或手动清空缓存,否则查询结果可能仍然是旧的、不准确的数据。

一级缓存状态

  一级缓存默认是开启的

一级缓存清除方式

1.手动清空:可以通过调用SqlSession.clearCache()方法来手动清空一级缓存。当调用这个方法后,一级缓存中的数据会被全部清除。
2.自动清空:当执行了增删改操作后,MyBatis会自动清空一级缓存。这是因为增删改操作会改变数据库中的数据,如果继续使用旧的缓存数据,可能会导致数据不一致的问题。
3.关闭SqlSession:当SqlSession对象被关闭时,与之关联的一级缓存也会被清除。因为SqlSession的生命周期结束,其内部的缓存数据也就不再需要了。
4.在MyBatis中,进行C/U/D(增删改)操作时:一级缓存会被清除。这是因为增删改操作会改变数据库中的数据,如果继续使用旧的缓存数据,可能会导致数据不一致的问题。为了保证数据的准确性和一致性,MyBatis在执行增删改操作后会自动清空一级缓存。这样,当下次执行相同的查询时,MyBatis会重新从数据库中获取数据,并将其缓存到一级缓存中,以供后续使用。

二级缓存

定义

  二级缓存(Level 2 Cache)是处理器内部的一些缓冲存储器,其作用与内存相似。它的主要作用是作为一级缓存和内存之间数据临时交换的地方。相较于一级缓存,二级缓存的速度更慢,但容量更大。
在CPU运行过程中,由于一级缓存的容量有限,无法存储所有CPU即将访问的数据,因此二级缓存的出现可以进一步协调一级缓存与内存之间的速度差异,提高CPU的运行效率。当CPU需要读取大量数据时,它可以避开内存直接从二级缓存中调用,从而大大加快了读取速度。
此外,二级缓存也叫作应用级缓存,与一级缓存不同,它的作用范围是整个应用,并且可以跨线程使用。因此,二级缓存具有更高的命中率,特别适合缓存一些修改较少的数据。

应用场景

1.数据库查询操作:在数据库查询操作中,二级缓存可以有效地提高查询效率,减少数据库的访问次数。通过缓存经常查询的数据,可以显著减少直接访问数据库的频率,从而提高整体的系统性能。
2.Java程序运行:在Java等编程环境中,二级缓存也发挥着重要作用。它可以减少内存读取时间,优化程序运行效率。特别是在处理大量数据时,二级缓存能够显著提升数据处理速度。
3.消息队列和数据同步:在某些复杂的应用场景下,如使用消息队列(如Redis)进行数据同步时,二级缓存也扮演着重要角色。例如,当数据表中有增删改操作时,可以通过消息队列触发更新Redis缓存,确保数据的实时性和一致性。
4.社交网络与物联网:在社交网络和物联网等应用中,二级缓存也发挥着关键作用。通过将用户的个人信息、动态信息或物联网设备采集的数据缓存到二级缓存中,可以显著提高应用的响应速度和性能。

不适合场景

1、经常被修改的数据
2、财务数据,绝对不允许出现并发
3、与其他应用共享的数据。

二级缓存状态

  二级缓存默认不开启。
开启方式:在配置文件中输入以下代码

<setting name="cacheEnabled" value="true" />

二级缓存清除方式

1.LRU(Least Recently Used)策略:这种策略会清除最长时间未被使用的对象。当缓存达到最大容量时,最久未使用的数据会被自动移除。
2.FIFO(First In First Out)策略:按照对象进入缓存的顺序进行清除,最早进入缓存的对象会被最先移除。
3.软引用和弱引用策略:基于Java的软引用和弱引用特性,当JVM内存不足时,软引用缓存中的数据可能会被清除;而弱引用缓存中的数据在任何时候都可能被JVM清除。
4.当执行更新操作(update、delete、insert)时:MyBatis会清空当前SqlSession的一级缓存。而对于二级缓存,它会在执行commit操作时被清空。这意味着,如果你在一个SqlSession中进行了增删改操作并提交了事务,那么不仅一级缓存会被清空,二级缓存也会受到影响。

一级缓存与二级缓存的区别

1.作用范围

一级缓存的作用范围是 SqlSession 的生命周期,二级缓存的作用范围是整个应用程序的生命周期。

2.存储作用域不同

一级缓存的存储作用域为Session,二级缓存作用域为Mapper(Namespace),并且可自定义存储源。

3.实现方式

一级缓存是通过 SqlSession 内置的一个 HashMap 来实现的,而二级缓存则是通过配置 Cache 接口来实现的。

4.共享机制

一级缓存只能在同一个 SqlSession 内部共享,二级缓存可以在多个 SqlSession 之间共享。

5.默认开启条件

一级缓存默认是开启;二级缓存需要手动开启并需要在配置文件中进行配置。

查找数据的顺序

  当一级缓存和而二级缓存都存在时,首先选择在二级缓存中进行数据的查询,当二级缓存未开启时,选择在一级缓存中进行数据的查询,当一级缓存不存在时,直接到数据库中查询。
   博主用心写,读者点关注;互动传真情,知识不迷路。

  • 37
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 16
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值