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中包含空格

 




posted @ 2018-10-22 19:48  花千叔  阅读(209)  评论(0编辑  收藏  举报