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

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 不互相影响)。

相关文章:

  • WPF之TextBox控件详解
  • LeRobot 项目部署运行逻辑(三)——机器人及舵机配置
  • 黑苹果显卡免驱教程:蓝宝石RX580刷成RX570详细步骤(附工具与注意事项)
  • 分布式计算框架(Dask)与单机库(Pandas)数据处理方法对比分析
  • 小知识总结记录
  • 数据库的死锁相关(一)
  • 软考:硬件中的CPU架构、存储系统(Cache、虚拟内存)、I/O设备与接口
  • 泛微OA.E9--07--IDEA搭建后端二开环境
  • Docker进入MySQL之后如何用sql文件初始化数据
  • 关于杰理ac791切换版本, git clone下来仍然是最新版本问题
  • 使用Docker部署魔豆文库:本地化搭建私有文档管理系统
  • Godot笔记:入门索引
  • 第一章 OpenCV篇-配置及基础知识-Python
  • Ethan独立开发产品日报 | 2025-04-29
  • 研发效率破局之道阅读总结(4)个人效率
  • MIPS架构详解:定义、应用与其他架构对比
  • SpringBoot 设置HTTP代理访问
  • C++智能指针应用详解:从原理到实战
  • Rust 学习笔记:关于结构体的例题
  • 【中间件】bthread效率为什么高?
  • 马上评丨上热搜的协和“4+4”模式,如何面对舆论审视
  • 运动健康|不同能力跑者,跑步前后营养补给差别这么大?
  • 五一假期上海地铁部分线路将延时运营,这些调整请查收
  • 自称“最美”通缉犯出狱当主播?央广网:三观怎能跟着“五官”跑
  • 财政部农业农村司司长吴奇修接受纪律审查和监察调查
  • 挤占学生伙食费、公务考察到景区旅游……青岛通报5起违规典型问题