“
有时候博客内容会有变动,首发博客是最新的,其他博客地址可能未同步,请认准https://blog.zysicyj.top
”
首发博客地址[1]
文章更新计划[2]
系列文章地址[3]
报错内容
报错信息显示ID重复。
原因分析
在最终添加的方法中,出现了重复ID的报错。对于为什么ID会重复,我思考了很久也没有想通。我沿着代码往上找到了saveList。
int batchSize = 5000;
if (CollUtil.isNotEmpty(saveList)) {
List batchList = ListUtil.partition(saveList, batchSize);
for (List batch : batchList) {
if (CollUtil.isNotEmpty(batch)) {
firstRecordMapper.insertJghzLdryList(batch.stream().filter(v -> v != null && ObjectUtil.isNotEmpty(v.get("ID"))).collect(Collectors.toList()));
}
}
}
代码大致如上所示。
for (Map item : list) {
...
Map oneCellMap = new HashMap();
// 遍历这一类型的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 item : list) {
...
// 遍历这一类型的10个二级指标,每个指标存成一行数据
for (int i = 0; i < secIndexNameList.size(); i++) {
...
Map oneCellMap = new HashMap();
oneCellMap.put("ID", IdUtilV2.getInstance().getId());
...
saveList.add(oneCellMap);
px++;
}
// 保存这一行数据的 综合得分
Map oneCellMap = new HashMap();
oneCellMap.put("ID", IdUtilV2.getInstance().getId());
...
saveList.add(oneCellMap);
}
然后问题就解决了。我感到很奇怪,后来才反应过来...原来是使用了同一个对象。
解决方案
问题的根本原因是在循环中重复使用了同一个oneCellMap对象,导致了ID重复的问题。在第一个版本的代码中,每次循环都会清空oneCellMap对象并重新添加ID,但是由于saveList中保存的是引用,所以最终saveList中的所有oneCellMap对象的ID都是相同的。
在修改后的代码中,每次循环都创建了一个新的oneCellMap对象,确保了每个oneCellMap对象的ID都是唯一的,解决了ID重复的问题。
参考资料
[1]
首发博客地址: https://blog.zysicyj.top/
[2]
文章更新计划: https://blog.zysicyj.top/update_plan/
[3]
系列文章地址: https://blog.zysicyj.top/categories/技术文章/后端技术/系列文章/RocketMq/
领取专属 10元无门槛券
私享最新 技术干货