作者:Eddy 历史版本:1 最后编辑:龚清 更新时间:2024-09-20 15:13
适用版本:v3.3.8+;
使用缓存时如何解决第一次和第二次查询数据不一致
特征:清除缓存后,第一次数据加载正确,后续数据就出现了不一致的情况;
原因:系统中使用缓存,系统会优先查找缓存数据,如果缓存中没有才进行数据库查询;第一次查询时Repository返回数据,并且将数据放在内存中,返回数据的引用,后续代码通过这个引用对数据进行修改,导致缓存中的数据被修改;第二次再查询由于缓存中已经有数据,所以直接返回缓存中的数据,但返回的是数据已经被第一次查询后作了修改,跟第一次返回就产生了差异。
解决方法:将Repository返回的数据进行深层次复制,不使用原数据引用,避免缓存原数据被修改。
- 如果是Object对象,使用以下代码进行复制:
P po = (P)com.lc.ibps.base.core.util.BeanUtils.copyNotNullProperties(p.getClass(), p);
- 如果是列表对象,使用以下代码进行复制:
List<BpmApprovePo> result = com.lc.ibps.base.core.util.Collections.deepCopy(list);
例子:
// 仓库查询数据
List<BpmApprovePo> list = bpmApproveRepository.getByInstId(procInstId);
// 通过深层次复制对象,提供后续使用
List<BpmApprovePo> result = com.lc.ibps.base.core.util.Collections.deepCopy(list);
// 过滤任务已经代理出去并且看不见的人
filterAgent(result);