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