DefaultIdentifierGenerator 雪花算法 生成 重复 id

  • 前言
  • 问题发生
  • 排查原因
  • 问题解决

前言

利用 mybatisplus 的 DefaultIdentifierGenerator 生成 id 当做主键,人家的代码没有问题,是自己程序代码问题导致。

问题发生

利用 mybatisplus 的 DefaultIdentifierGenerator 生成 id 当做主键,然后批量新增数据后,丫的报错了

BatchUpdateException: Duplicate entry '1331426208168046594' for key 'PRIMARY'"

主键冲突!!!!

可是创建的 id 是用方法生成了啊 (ノへ ̄、)

 private Number createId() {IdentifierGenerator identifierGenerator = new DefaultIdentifierGenerator();return identifierGenerator.nextId(new Object());}

排查原因

接下来就是排查原因了,首先看一下它源码是怎么生成数据的。

首先看到了锁,java 在jdk1.6之后优化了 synchronized ,使得它不会是直接变成重量级锁,所以调用此方法并不会有并发问题,且对同一毫秒的判断序列号也自增了,理论上并不会出现重复id的情况。

观察一遍发现问题所在。


它的 时间判断参数是一个成员变量,生命周期跟着 当前类走。


而调用的方法并不是个单例模式,所以每次新建一个对象,其内部判定的时间判断参数都是独立存在的,这样的话在并行程序的过程中,是有可能生成相同的id的。

原本怀疑是否是使用了 java 8 的 stream 的原因。然而发现,人家默认就是串行流,要使用并行流是需要而外加方法的,所以和这个没有关系。

问题解决

有两种方式解决:

  1. 写一个 IdentifierGenerator util ,既然 DefaultIdentifierGenerator 的 Sequence 不是单例,那么我们就在外层做操作,把调用到的 IdentifierGenerator 变成单例。
  2. IdWorker 这个类是 MyBatis Plus 雪花算法的实现,直接调用其方法获取,它内部是单例实现的。ps(若没有特殊需求,用官方提供的就好了)

DefaultIdentifierGenerator 雪花算法 生成 重复 id 解决办法相关推荐

  1. 基于雪花算法生成用户id

    8.1 为啥这样做 1.全局唯一性,不会出现重复的id.如果通过id自增来保证id不重复,则该表 无法分表操作例如 服务器A的数据库的user表 数据如下1 小明 男2 小红 女2 张三 男此时 进行 ...

  2. 分布式下使用雪花算法生成全局ID及解决时钟回拨问题

    简介 雪花算法是 64 位 的二进制,一共包含了四部分: 1位是符号位,也就是最高位,始终是0,没有任何意义,因为要是唯一计算机二进制补码中就是负数,0才是正数 41位是时间戳,具体到毫秒,41位的二 ...

  3. 雪花算法生成分布式ID的时间回拨问题处理

    一般方法 1.直接抛异常 2.延迟等待到最新时间(需要回拨时间比较短) 3.采用历史最大时间 package com.zjq.javabasic.algorithm;/*** @description ...

  4. python版雪花算法生成唯一ID

    一.雪花算法图解 理论一大堆,总结如下图: 下方为源码,返回的结果为19位,为10进制表示,使用二进制表示就是64位,所以不必有所疑惑. 二.源码 1.异常捕获块 文件名:exceptions.py ...

  5. php绘制雪花墙,基于雪花算法的 PHP ID 生成器

    Snowflake 是 Twitter 内部的一个 ID 生算法,可以通过一些简单的规则保证在大规模分布式情况下生成唯一的 ID 号码. 其组成为: 第一个 bit 为未使用的符号位. 第二部分由 4 ...

  6. 注意:雪花算法并不是ID的唯一选择!

    Hollis的新书限时折扣中,一本深入讲解Java基础的干货笔记! 在<悟空传>篇外篇里,有一个忧伤的故事. 秋天,树上掉下两片叶子,你要和它们说再见.但你如何知道这片叶子,不是另外一片叶 ...

  7. 根据时间戳生成编号_使用雪花算法生成流水号!

    前言"在分布式系统中常见的问题就是如何生成流水号,一般情况下会有专门的流水号系统,不过在开发过程中或者开发早期不一定会有专门流水号系统,在这里介绍下我所使用的流水号生成器--雪花算法&quo ...

  8. 雪花算法snowflake分布式id生成原理详解,以及对解决时钟回拨问题几种方案讨论

    文章目录 一.前言 二.雪花算法snowflake 1.基本定义 2.snowflake的优缺点 三.Java代码实现snowflake 1.组装生成id 2.计算最大值的几种方式 3.反解析ID 4 ...

  9. 线上使用雪花算法生成id重复问题

    项目中使用的是hutool工具类库提供的雪花算法生成id方式,版本使用的是5.3.1 <dependency><groupId>cn.hutool</groupId> ...

最新文章

  1. token 的设计方案
  2. python方法测试_python 测试常用小方法
  3. 房产众筹项目质疑声中再推出
  4. python 字符串转日期_我总结的130页Python与机器学习之路V1.2.pdf,都是干货!
  5. C# 使用TcpClient 测试网络连接是否正常
  6. excel删除行闪退_excel2010闪退的处理方法
  7. 计算机硬件格式,排版格式要求_计算机硬件及应用_IT/计算机_资料
  8. 阶段5 3.微服务项目【学成在线】_day02 CMS前端开发_14-webpack研究-webpack-dev-server...
  9. Java写的答题助手项目分析与总结(三)
  10. java 32进制10进制互转
  11. u-center出现r6002错误
  12. linux新增字符串,字符串添加字符_Linux使用sed命令添加字符串的方法
  13. 什么是Wiegand协议?什么是韦根26? 什么是韦根34?
  14. 非线性拟合matlab代码,Matlab非线性拟合
  15. 用网络求t图的几篇论文框架图
  16. CAD直接打印,不出现打印对话框
  17. pycharm显示全部数据_【数据可视化】BI工程师岗位分析
  18. java 消除png 锯齿_反转(移除)抗锯齿滤波器
  19. Sign function
  20. OracleOCP认证 之 Linux基础

热门文章

  1. 百家号自媒体推荐模式:怎么发文章才能“爆文”
  2. 【STM32F429的DSP教程】第31章 STM32F429实数浮点FFT(支持单精度和双精度)
  3. redis 什么是冷数据_redis 冷数据存储格式
  4. 【mybatis】mybatis的特性和优势
  5. 快速排序——Java代码实现
  6. eNSP 配置MPLS 不同局域网互通
  7. 配制路由器让我来教你(经典)
  8. 2022-2028年中国中低温余热发电行业市场发展潜力及投资前景分析报告
  9. GDP与人预期寿命的关系图----R
  10. lombok插件介绍