作者: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);