首页 > 其他分享 >mybatis-plus id在高并发下出现重复

mybatis-plus id在高并发下出现重复

时间:2024-05-17 16:57:03浏览次数:14  
标签:snowflakeUtil id public plus mybatis nextId snowflake

mybaits-plus ASSIGN_ID生成

id生成策略 在分布式高并发环境下出现重复id https://github.com/baomidou/mybatis-plus/issues/3077
mybatis-plus 对@TableId(type = IdType.ASSIGN_ID)生成默认使用com.baomidou.mybatisplus.core.toolkit.Sequence,这个类是雪花算法的实现,在该实现中workid,datacenterid是根据网卡硬件地址生成,而部署在docker容器内的应用读取不到宿主机的硬件地址

什么是雪花算法

雪花算法是Twitter开源的一种全局唯一ID生成算法,它可以生成一个64位的整数ID。在雪花算法中,workerid是一个重要的参数,用于标识不同的机器。需要保证在不同的机器之间是唯一的,通常可以通过MAC地址或者IP地址来生成workerid。
image

解决方案

解决思路是,只要workid,datacenterid中组合确保在所有节点中唯一就解决问题。
下面选用了redis的自增值解决,当然也可以使用zookeeper、mysql等等,从已有的组件中选就好
com.baomidou.mybatisplus.core.toolkit.Sequence#getMaxWorkerId

/**
*  通过redis自增初始化的snowflake
*/
@Component
public class SnowflakeUtil {

    private volatile Snowflake snowflake;

    @Resource
    private RedissonClient redissonClient;

    public long nextId() {
        return getSnowflake().nextId();
    }

    public String nextIdStr() {
        return String.valueOf(nextId());
    }

    public Snowflake getSnowflake() {

        if (snowflake == null) {
            synchronized (SnowflakeUtil.class) {
                if (snowflake == null) {
                    long workId = redissonClient.getAtomicLong("snowflake:worker").getAndIncrement();
                    snowflake = IdUtil.createSnowflake(workId % 32, 1);
                }
            }
        }

        return snowflake;
    }

}

/**
* 替换mybatis-plus ASSIGN_ID的生成器
*/
@Component
public class IdGenerator implements IdentifierGenerator {

    private final SnowflakeUtil snowflakeUtil;

    public IdGenerator(SnowflakeUtil snowflakeUtil) {
        this.snowflakeUtil = snowflakeUtil;
    }

    @Override
    public Number nextId(Object entity) {
        return snowflakeUtil.nextId();
    }
}

标签:snowflakeUtil,id,public,plus,mybatis,nextId,snowflake
From: https://www.cnblogs.com/zmj-pr/p/16856864.html

相关文章

  • odoo widget新建
    自己模快下创建static/src/main_process目录结构文件夹main_process.scsshttps://files.cnblogs.com/files/blogs/822815/main_process.css?t=1715930844&download=truemain_process.jshttps://files.cnblogs.com/files/blogs/822815/main_process.js?t=1715930813&download=t......
  • BOSHIDA AC/DC电源模块的设计与优化
    BOSHIDAAC/DC电源模块的设计与优化AC/DC电源模块是一种将交流电转换为直流电的设备,广泛应用于各种电子设备中。其设计与优化对于提高电源的效率、稳定性以及可靠性非常重要。在设计与优化AC/DC电源模块时,需要考虑以下几个方面。 首先,设计AC/DC电源模块需要选择合适的开关器......
  • element-plus table部分列根据接口返回key展示
    实现效果根据刷选年份返回对应年份作为部分列1.处理接口数据接口返回数据格式需要处理成 处理过程data.message&&data.message.forEach((item:any)=>{letobj={}for(varkeyinitem){if(Number(key)){......
  • Mybatis-plus多租户用例
    我们可以通过注解+配置实现项目多租户数据隔离注解定义:importjava.lang.annotation.ElementType;importjava.lang.annotation.Retention;importjava.lang.annotation.RetentionPolicy;importjava.lang.annotation.Target;@Retention(RetentionPolicy.RUNTIME)@Target(......
  • ESP32+RS485参考代码要点+@环境esp-idf-v5.1.2 +vscode 草稿
    在环境esp-idf-v5.1.2+vscode 中,如何在一个文件内,调用另外一个文件夹内定义的函数。 设置帧内间隔(在传输线上,两个发送的字节之间的时间间隔,不超过3.5发送单个字节的时间。)通过函数esp_err_tuart_set_rx_timeout(uart_port_tuart_num,constuint8_ttout_thresh)实现此......
  • 配置所需的各种信息(Nvidia对应Cuda,显卡等兼容信息)
    nvidia各型号显卡算力、CUDA、cuDNN、驱动对应版本表1:显卡型号信息表2:CUDA工具包和CUDA最小版本兼容性所需的最低驱动程序版本GeForceRTX3090显卡仅支持CUDA11以上的版本。且Pytorch1.7.0开始支持CUDA11......
  • 关于IDEA使用xml实现动态sql的问题
     如上图,我在mapper层编写了一个list方法用于实现动态sql。1.导入使用xml文件的mybatis依赖。 2.配置文件的修改.properties .yml mybatis.mapper-locations=classpath:mapper/*.xml:这个配置项指定了MyBatis映射器XML文件的位置。值classpath:mapper/*.xml......
  • 通过mybatisflex获取多数据源mapper
    基于mybatisflex1.8.4:@NoArgsConstructor(access=AccessLevel.PRIVATE)@Slf4jpublicclassDataSource{publicstaticfinalStringA="a";publicstaticfinalStringB="b";publicstaticfinalStringC="c";pub......
  • mybatis-plus mapper整理
    mybatis-plusmapper整理简介提供了操作数据的框架,避免使用jdbc操作数据,加速开发效率,支持多种数据库(databaseId)。既支持sql,mapper的编写,也支持注解@Select等,同时提供了一二级缓存,以及BaseMapper接口以及IService、ServiceImpl这些接口,来提供模板化的方法。同时还支持逆向工程生......
  • Validated数据校验
    引入pom文件依赖<dependency>  <groupId>org.springframework.boot</groupId>  <artifactId>spring-boot-starter-validation</artifactId></dependency>依赖文章地址https://blog.csdn.net/MINGHUE/article/details/121543101 详细讲解用法地址https......