解决mybatis-plus内置雪花算法主键重复问题,部署不同服务器上的主键id重复问题

目录

前言:

问题场景描述

问题范围分析

解决办法 

实际的YML文件配置项:

​编辑

问题原因说明

另外一种解决办法是升级最新的版本3.5.2进行自定义ID主键算法 

官网参考


前言:

mybatis 的IDWork.getId 其实在集群里面(这里面是同一个网段,且链接同一个nginx服务器,且同时连接同一个数据库)会产生id重复问题,那么如何才能解决?

问题场景描述

前阵子真实的场景是这样的:

主要是线上部署俩台服务器,此时此刻产生的俩台服务器上的Mybatis-plus会生成同样的id, 因为会这样的几率,每一次发生排查都很麻烦。93机器debug日志显示已经插入数据成功;94这台机器显示主键冲突。

问题范围分析

首先分析的是id生成怎么会无缘故的居然会重复,都是新对象进行insert数据库,且是俩台服务器,以为是数据的原因,然后咨询了DBA,看了MYSQL的官网,主键设置自增的不会出现主键冲突的情况,那就只会插入前,赋值出现了同样的主键ID

问题范围定位之后就需要进行源码分析,进行进一步确认,通过Mybatis-plus的主键赋值操作,跟踪到IDwork的getID怎么算出来的。 

最新版本的生产id的依赖。机器代码主要是5位数长度。2的5次方=32;下面是目前的源码

protected long getDatacente
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
MyBatis-PlusID生成策略中,如果使用的是雪花算法(Snowflake),它是Twitter开源的一种分布式ID生成方案,主要为了解决高并发下生成不重复ID问题。在集群部署的情况下,可能会遇到ID重复问题,因为每个节点都有自己的时间戳和序列号生成ID解决ID重复的方法通常包括: 1. **配置全局唯一ID**: MyBatis-Plus提供了一个全局唯一ID生成器`SnowflakeIdWorker`,它会根据节点ID和毫秒数生成一个64位的ID。确保所有节点都配置相同的集群ID和序列号,这样可以保证ID的一致性。 ```java // 雪花算法配置示例 GlobalConfig global = new GlobalConfig(); global.setIdGenerator(new SnowflakeIdWorker(0, 0)); // 集群ID和序列号 ConfigUtil.initGlobal(global); ``` 2. **数据库层面的唯一索引**: 对于自增ID,可以在数据库表的主键字段上创建一个唯一索引,当插入操作发现该ID已经存在时,可以回滚事务或更新失败的记录。 3. **分布式锁**: 在高并发场景下,可能需要考虑使用分布式锁来确保同一时间只有一个节点生成新的ID,其他节点等待锁释放后才生成。 4. **分片策略**: 如果应用数据量非常大,可以考虑按照一定的规则对数据进行分片,每个分片使用独立的ID生成器,降低冲突概率。 相关问题: 1. 雪花算法是如何保证ID全局唯一的? 2. 在分布式环境中,如何配置MyBatis-Plus避免ID重复? 3. 分布式锁如何配合雪花算法MyBatis-Plus中使用?
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

道阻且长-行则将至-行而不辍-未来可期

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值