关于mybatis的一级缓存和二级缓存的理解

1、一级缓存问题

一级缓存:存在于单个会话之中,当会话提交或者关闭,会清空缓存,缓存数据存在会话中的executor的localcache中,缓存sql的数据被修改也会清空缓存,但当我们使用分布式部署时,每个机器上的每个会话独享自己的缓存,且每个机器无法共享一级缓存上数据是否被修改,这就导致一种情况,A,B服务器上A、B会话之前都缓存了某条数据,现在A服务上修改了该条数据,A服务A会话的缓存被清空了,但B服务器的B会话的缓存仍然是之前的数据,不知道该数据已经被更改,导致在B服务器上执行的脏读。

1、1 解决办法

调整一级缓存的作用范围,设置 LocalCache 级别为 statement 或者在语句上设置 flushCache=“true” 都可以。目的就是使一级缓存失效。

2、二级缓存问题

跨会话的,开启二级缓存后,会使用CachingExecutor装饰Executor,进入一级缓存的查询流程前,先在CachingExecutor进行二级缓存的查询,二级缓存没找到再去一级缓存找,一级缓存也没有就直接查数据库;
但二级缓存对于多表查询容易产生脏读,因为他的缓存是基于namaspace的,如果跨越了namespace其他命名空间去修改了数据,我们是监测不到的,就导致当前的命名空间查询出来的缓存数据是存在问题的;
分布式环境下,由于默认的MyBatis Cache实现都是基于本地的,分布式环境下必然会出现读取到脏数据,可以通过Cache接口实现,但那玩意想想都复杂,成本太大,不如直接用分布式的redis做数据缓存;

3、总结

一级缓存用处不大,默认开启,分布式下不能使用;
二级缓存使用联表查询可能出问题,条件比较苛刻,所以还是不用比较好;但如果对数据一致要求不是那么高,倒也无所谓了;
单体架构推荐spring提供的ehcache做数据缓存;
分布式架构直接使用redis做数据缓存;

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

落日晓余晖

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

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

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

打赏作者

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

抵扣说明:

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

余额充值