短影片開源原始碼,報錯資訊顯示ID重複的解決方案

云豹科技-苏凌霄發表於2024-11-16

短影片開源原始碼,報錯資訊顯示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重複的問題。

以上就是短影片開源原始碼,報錯資訊顯示ID重複的解決方案, 更多內容歡迎關注之後的文章

相關文章