DefaultIdentifierGenerator 雪花算法 生成 重复 id 解决办法
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 的原因。然而发现,人家默认就是串行流,要使用并行流是需要而外加方法的,所以和这个没有关系。
问题解决
有两种方式解决:
- 写一个 IdentifierGenerator util ,既然 DefaultIdentifierGenerator 的 Sequence 不是单例,那么我们就在外层做操作,把调用到的 IdentifierGenerator 变成单例。
- IdWorker 这个类是 MyBatis Plus 雪花算法的实现,直接调用其方法获取,它内部是单例实现的。ps(若没有特殊需求,用官方提供的就好了)
DefaultIdentifierGenerator 雪花算法 生成 重复 id 解决办法相关推荐
- 基于雪花算法生成用户id
8.1 为啥这样做 1.全局唯一性,不会出现重复的id.如果通过id自增来保证id不重复,则该表 无法分表操作例如 服务器A的数据库的user表 数据如下1 小明 男2 小红 女2 张三 男此时 进行 ...
- 分布式下使用雪花算法生成全局ID及解决时钟回拨问题
简介 雪花算法是 64 位 的二进制,一共包含了四部分: 1位是符号位,也就是最高位,始终是0,没有任何意义,因为要是唯一计算机二进制补码中就是负数,0才是正数 41位是时间戳,具体到毫秒,41位的二 ...
- 雪花算法生成分布式ID的时间回拨问题处理
一般方法 1.直接抛异常 2.延迟等待到最新时间(需要回拨时间比较短) 3.采用历史最大时间 package com.zjq.javabasic.algorithm;/*** @description ...
- python版雪花算法生成唯一ID
一.雪花算法图解 理论一大堆,总结如下图: 下方为源码,返回的结果为19位,为10进制表示,使用二进制表示就是64位,所以不必有所疑惑. 二.源码 1.异常捕获块 文件名:exceptions.py ...
- php绘制雪花墙,基于雪花算法的 PHP ID 生成器
Snowflake 是 Twitter 内部的一个 ID 生算法,可以通过一些简单的规则保证在大规模分布式情况下生成唯一的 ID 号码. 其组成为: 第一个 bit 为未使用的符号位. 第二部分由 4 ...
- 注意:雪花算法并不是ID的唯一选择!
Hollis的新书限时折扣中,一本深入讲解Java基础的干货笔记! 在<悟空传>篇外篇里,有一个忧伤的故事. 秋天,树上掉下两片叶子,你要和它们说再见.但你如何知道这片叶子,不是另外一片叶 ...
- 根据时间戳生成编号_使用雪花算法生成流水号!
前言"在分布式系统中常见的问题就是如何生成流水号,一般情况下会有专门的流水号系统,不过在开发过程中或者开发早期不一定会有专门流水号系统,在这里介绍下我所使用的流水号生成器--雪花算法&quo ...
- 雪花算法snowflake分布式id生成原理详解,以及对解决时钟回拨问题几种方案讨论
文章目录 一.前言 二.雪花算法snowflake 1.基本定义 2.snowflake的优缺点 三.Java代码实现snowflake 1.组装生成id 2.计算最大值的几种方式 3.反解析ID 4 ...
- 线上使用雪花算法生成id重复问题
项目中使用的是hutool工具类库提供的雪花算法生成id方式,版本使用的是5.3.1 <dependency><groupId>cn.hutool</groupId> ...
最新文章
- token 的设计方案
- python方法测试_python 测试常用小方法
- 房产众筹项目质疑声中再推出
- python 字符串转日期_我总结的130页Python与机器学习之路V1.2.pdf,都是干货!
- C# 使用TcpClient 测试网络连接是否正常
- excel删除行闪退_excel2010闪退的处理方法
- 计算机硬件格式,排版格式要求_计算机硬件及应用_IT/计算机_资料
- 阶段5 3.微服务项目【学成在线】_day02 CMS前端开发_14-webpack研究-webpack-dev-server...
- Java写的答题助手项目分析与总结(三)
- java 32进制10进制互转
- u-center出现r6002错误
- linux新增字符串,字符串添加字符_Linux使用sed命令添加字符串的方法
- 什么是Wiegand协议?什么是韦根26? 什么是韦根34?
- 非线性拟合matlab代码,Matlab非线性拟合
- 用网络求t图的几篇论文框架图
- CAD直接打印,不出现打印对话框
- pycharm显示全部数据_【数据可视化】BI工程师岗位分析
- java 消除png 锯齿_反转(移除)抗锯齿滤波器
- Sign function
- OracleOCP认证 之 Linux基础