mybaits缓存机制及其造成的问题

业务需求在每次单据状态改变时进行切片并写入mq

方案是在切片中,根据单据id再次查找一遍单据,对比状态后写入mq

但实际操作过程中发现很多状态并未写入

代码如下

ServiceOrder serviceOrder = (ServiceOrder) point.getArgs()[0];
ServiceOrder serviceOrder1 = serviceOrderMapper.findById(serviceOrder.getId());

经过debug调试发现serviceOrder和serviceOrder1的地址相同,导致状态永远是相同的

解决方案是在mapper内新增一个方法,更改命名空间名称

ServiceOrder serviceOrder = (ServiceOrder) point.getArgs()[0];
ServiceOrder serviceOrder1 = serviceOrderMapper.aspSelectByServiceOrderId(serviceOrder.getId());

这样两个单据的内存就不同了。

mysql缓存可查看

https://blog.csdn.net/z742182637/article/details/72569014

查看mybaits源码会发现,缓存CacheKey创建方式如下:

CacheKey cacheKey = new CacheKey();
cacheKey.update(ms.getId());
cacheKey.update(rowBounds.getOffset());
cacheKey.update(rowBounds.getLimit());
cacheKey.update(boundSql.getSql());

CahceKey参数主要有id:命名空间ID,分页信息,sql语句组成,更换ID导致未命中缓存,新查询后两张单据的结果不同

CahceKey举例如下:

-1969473102:690395227:**.**.**.biz.mapper.business.ServiceOrderMapper.findById:0:2147483647:SELECT *
FROM serviceOrder
WHERE id = ?;

注意key中包含空格

 

 
 


转载于:https://www.cnblogs.com/codingcheng/p/9832295.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值