当前位置: 首页 > web >正文

Java批量数据处理唯一ID生成优化

源代码:

// 3. 保存子债信息及其关联信息 
if (mdmDcmSubStructurizeInfoDoList != null && !mdmDcmSubStructurizeInfoDoList.isEmpty()) {   for (MdmDcmSubStructurizeInfoDo subStructurizeInfoDo : mdmDcmSubStructurizeInfoDoList) {                //设置子债项目标识--projectId=基础产品类型[basicProductType]+年月日+4位流水号subStructurizeInfoDo.setProjectId(getGenerateProjectId(subStructurizeInfoDo.getBasicProductType()));                // 保存子债基本信息               MdmDcmSubStructurizeInfo subStructurizeInfo = new MdmDcmSubStructurizeInfo();BeanUtils.copyProperties(subStructurizeInfoDo, subStructurizeInfo);subStructurizeInfo.setProjectId(projectId); // 设置主债项目标识 mdmDcmSubStructurizeInfoMapper.insert(subStructurizeInfo);                String subBondId = subStructurizeInfo.getBondId(); // 获取子债项目标识                         // 保存子债特有信息                saveSubBondSpecificInfo(subBondId, subStructurizeInfoDo);                 // 保存子债冗余的主债关联信息(发起机构、实际融资人等)             saveRedundantMainBondRelations(projectId, subBondId, mdmDcmStructuriseInfoDo);            }        
} 

问题:在保存子债信息时,设置子债项目标识--projectId=基础产品类型[basicProductType]+年月日+4位流水号,当有多个子债时,可能会为不同的子债生成相同的projectId

原因:在生成ID时没有考虑同一批次内多子债的并发情况和已存在的记录。

更正:

// 3. 保存子债信息及其关联信息
if (mdmDcmSubStructurizeInfoDoList != null && !mdmDcmSubStructurizeInfoDoList.isEmpty()) {// 先获取当天该基础产品类型的最大流水号String datePart = LocalDate.now().format(DateTimeFormatter.BASIC_ISO_DATE);Map<String, Integer> productTypeSequenceMap = new HashMap<>();
​
// 初始化各基础产品类型的最大流水号
for (MdmDcmSubStructurizeInfoDo subStructurizeInfoDo : mdmDcmSubStructurizeInfoDoList) {String basicProductType = subStructurizeInfoDo.getBasicProductType();if (!productTypeSequenceMap.containsKey(basicProductType)) {// 查询数据库中该基础产品类型当天的最大流水号int maxSequence = getMaxSequenceForProductType(basicProductType, datePart);productTypeSequenceMap.put(basicProductType, maxSequence);}
}
​
// 保存子债信息
for (MdmDcmSubStructurizeInfoDo subStructurizeInfoDo : mdmDcmSubStructurizeInfoDoList) {String basicProductType = subStructurizeInfoDo.getBasicProductType();// 获取并递增流水号int currentSequence = productTypeSequenceMap.get(basicProductType) + 1;productTypeSequenceMap.put(basicProductType, currentSequence);// 生成唯一projectIdString projectId = basicProductType + datePart + String.format("%04d", currentSequence);subStructurizeInfoDo.setProjectId(projectId);// 保存子债基本信息MdmDcmSubStructurizeInfo subStructurizeInfo = new MdmDcmSubStructurizeInfo();BeanUtils.copyProperties(subStructurizeInfoDo, subStructurizeInfo);subStructurizeInfo.setBondId(projectId); // 设置主债项目标识mdmDcmSubStructurizeInfoMapper.insert(subStructurizeInfo);String subBondId = subStructurizeInfo.getProjectId(); // 获取子债项目标识
​// 保存子债特有信息saveSubBondSpecificInfo(subBondId, subStructurizeInfoDo);
​// 保存子债冗余的主债关联信息(发起机构、实际融资人等)saveRedundantMainBondRelations(projectId, subBondId, mdmDcmStructuriseInfoDo);}}

总结:用productTypeSequenceMap 来确保同一批次内的子债ID生成是唯一且递增

KEY (STRING)基础产品类型(如 "ABC"),用于区分不同产品。
Value (Integer)当前该产品类型下已分配的最大流水号(如 3 表示已分配 0001-0003)。
  • 原子性递增:同一产品类型的流水号严格递增。

  • 线程隔离:不同产品类型的流水号独立(如 ABCDEF 不互相影响)。

http://www.xdnf.cn/news/3309.html

相关文章:

  • 如何用AI生成假期旅行照?
  • CUDA编程 - 如何使用 CUDA 流在 GPU 设备上并发执行多个内核 - 如何应用到自己的项目中 - concurrentKernels
  • 希尔伯特第十问题:是一个伪命题
  • 【android bluetooth 案例分析 03】【PTS 测试 】【PBAP/PCE/SSM/BV-10-C】
  • 用.net动态创建类的实例指南方案
  • MoonBit支持国产芯片开发--性能媲美C
  • 从零开始学Python游戏编程47-二维数组1
  • 一种基于光源评估并加权平均的自动白平衡方法(一)
  • 系统分析师-第十五章
  • nacos和redis本地启动
  • 小米MiMo推理大模型开源:7B参数规模超越更大规模模型
  • flutter开发音乐APP(简单的音乐播放demo)
  • StarRocks存算一体集群资源预估
  • 国产工业软件突破路径
  • 【Spring AI】Java结合ollama实现大模型调用
  • Java对集合进行操作,赋值新字段
  • 微前端统一状态树实现方案
  • 傅里叶与相位偏移
  • Python实例题:Python实现简易局域网视频聊天工具
  • 日记 - 2025.4.30 四月计划回顾、五月计划安排
  • Python10天突击-字符串输出
  • 【NumPy完全指南】从基础操作到高性能计算实战
  • LeetCode路径总和系列问题解析:I、II、III的解决方案与优化
  • 深入剖析ELT与ETL的区别
  • 3.5/Q1,GBD最新文章解读
  • (即插即用模块-特征处理部分) 四十五、(2024 TGRS) SFF 浅层特征融合模块
  • 远程 Debugger 多用户环境下的用户隔离实践
  • 12.SpringDoc OpenAPI 功能介绍(用于生成API接口文档)
  • malloc的实现原理
  • [Android 15] 在GlobalActionsDialog 中新增项目