共计 1613 个字符,预计需要花费 5 分钟才能阅读完成。
有时候博客内容会有变动,首发博客是最新的,其余博客地址可能未同步,请认准
https://blog.zysicyj.top
首发博客地址
文章更新打算
系列文章地址
报错内容
报错信息显示 ID 反复。
起因剖析
在最终增加的办法中,呈现了反复 ID 的报错。对于为什么 ID 会反复,我思考了很久也没有想通。我沿着代码往上找到了saveList
。
int batchSize = 5000;
if (CollUtil.isNotEmpty(saveList)) {List<List<Map<String, Object>>> batchList = ListUtil.partition(saveList, batchSize);
for (List<Map<String, Object>> batch : batchList) {if (CollUtil.isNotEmpty(batch)) {firstRecordMapper.insertJghzLdryList(batch.stream().filter(v -> v != null && ObjectUtil.isNotEmpty(v.get("ID"))).collect(Collectors.toList()));
}
}
}
代码大抵如上所示。
for (Map<String, Object> item : list) {
...
Map<String, Object> oneCellMap = new HashMap<String, Object>();
// 遍历这一类型的 10 个二级指标,每个指标存成一行数据
for (int i = 0; i < secIndexNameList.size(); i++) {
...
oneCellMap.clear();
oneCellMap.put("ID", IdUtilV2.getInstance().getId());
...
saveList.add(oneCellMap);
px++;
}
// 保留这一行数据的 综合得分
oneCellMap.clear();
oneCellMap.put("ID", IdUtilV2.getInstance().getId());
...
saveList.add(oneCellMap);
}
我也不是很确定,但我狐疑问题出在这里,于是我做了以下批改:
for (Map<String, Object> item : list) {
...
// 遍历这一类型的 10 个二级指标,每个指标存成一行数据
for (int i = 0; i < secIndexNameList.size(); i++) {
...
Map<String, Object> oneCellMap = new HashMap<String, Object>();
oneCellMap.put("ID", IdUtilV2.getInstance().getId());
...
saveList.add(oneCellMap);
px++;
}
// 保留这一行数据的 综合得分
Map<String, Object> oneCellMap = new HashMap<String, Object>();
oneCellMap.put("ID", IdUtilV2.getInstance().getId());
...
saveList.add(oneCellMap);
}
而后问题就解决了。我感到很奇怪,起初才反馈过去 … 原来是应用了同一个对象。
解决方案
问题的根本原因是在循环中重复使用了同一个 oneCellMap
对象,导致了 ID 反复的问题。在第一个版本的代码中,每次循环都会清空 oneCellMap
对象并从新增加 ID,然而因为 saveList
中保留的是援用,所以最终 saveList
中的所有 oneCellMap
对象的 ID 都是雷同的。
在批改后的代码中,每次循环都创立了一个新的 oneCellMap
对象,确保了每个 oneCellMap
对象的 ID 都是惟一的,解决了 ID 反复的问题。
<!– md tj.md –>
本文由 mdnice 多平台公布
正文完