有时候博客内容会有变动,首发博客是最新的,其余博客地址可能未同步,请认准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多平台公布