Mybatis二级缓存的缺陷

Mybatis的一级缓存默认开启,但与Spring整合后失效;二级缓存需手动配置,如通过在Mapper.xml中设置 eviction、readOnly、flushInterval 和 size 属性。缓存策略包括 LRU、FIFO、SOFT 和 WEAK。二级缓存问题包括可能产生脏数据,要求所有CRUD操作在同一命名空间内。由于二级缓存限制,实践中常选择外部缓存系统如Redis。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 一级缓存默认是开启的(但是整合了Spring,Mybatis的一级缓存默认就失效了)
  • 二级缓存是要手动配置开启的(二级缓存是mapper级别的缓存,可以跨SqlSession)

Mybatis二级缓存

开启二级缓存(xml方式):在*Mapper.xml中加入如下代码

<!--eviction: 清空缓存的策略
    readOnly: 是否只读
    flushInterval: 每个60秒刷新一次缓存
    size: 内存大小,最多存储结果对象或者列表的512个引用 -->
<cache readOnly="true" eviction="FIFO" flushInterval="60000" size="512"/>

缓存清除策略

  • LRU – 最近最少使用:移除最长时间不被使用的对象。
  • FIFO – 先进先出:按对象进入缓存的顺序来移除它们。
  • SOFT – 软引用:基于垃圾回收器状态和软引用规则移除对象。
  • WEAK – 弱引用:更积极地基于垃圾收集器状态和弱引用规则移除对象。

两种方式二选一,如果都配置会报错:Caches collection already contains value for com.lixianhe.dao.UserMapper

注意:使用Mybatis二级缓存必须是xml写SQL语句,不能使用注解写SQL语句

缓存的执行顺序

  • 先从二级缓存中查询,二级缓存没有进入SqlSession中查询
  • SqlSession没有就去数据库查询,然后存到一级缓存中,查询完关闭SqlSession
  • 一级缓存再提交给二级缓存

在开启二级缓存的情况下执行一条sql

select colA1, colA2, colB1, colB2 
from A, B 
where ...
  1. A表执行了上述的sql
  2. B表更新了字段cloB1,colB2
  3. A表再次执行了上述的sql(前提没有执行insert、update、delete)

A表第二次就查询出了脏数据(B表的数据就是脏数据),这个问题对二级缓存来说是一个无解的问题

因此Mybatis二级缓存的使用用一个前提,必须保证所有的增删改查都在同一个namespace下才行

由于二级缓存的弊端,所以并不建议在实际生产中使用,而是在外部实现自己的缓存,如使用Redis做缓存

MyBatis二级缓存是一种缓存机制,它可以在应用程序和数据库之间缓存查询结果,以提高查询性能。下面是二级缓存的优缺点。 优点: 1. 减少数据库的访问次数:二级缓存可以将数据存储在内存中,当相同的查询被多次执行时,可以直接从缓存中获取结果,减少了对数据库的访问次数,提高了查询性能。 2. 提升应用程序性能:通过减少数据库的IO操作和网络传输,二级缓存可以大大提升应用程序的性能和响应速度。 3. 支持分布式环境:二级缓存可以在分布式环境中使用,多个应用程序实例可以共享缓存数据,提高了整体的性能和扩展性。 缺点: 1. 数据更新一致性:由于二级缓存是独立于数据库的,当数据库中的数据发生变化时,缓存中的数据可能不会即时更新,可能会导致数据不一致的问题。需要开发者手动维护缓存与数据库的一致性。 2. 内存消耗:二级缓存需要占用一定的内存空间来存储缓存数据,如果缓存数据过多或者缓存策略不合理,可能会导致内存消耗过大,影响系统的稳定性和性能。 3. 缓存失效问题:二级缓存的数据可能会因为应用程序重启或者缓存过期等原因而失效,需要合理设置缓存的有效期和更新机制来避免缓存失效问题。 总体而言,二级缓存可以在一定程度上提高应用程序的性能,但需要开发者在使用时注意以上提到的缺点,合理配置和管理缓存,以确保数据的一致性和系统的稳定性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

龙域、白泽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值