SqlSugar雪花ID常见问题

1、ORM中使用雪花ID

 1.1 普通插入

调用ExecuteReturnSnowflakeId方法主键会自动赋值雪花ID

public class 实体
{
   [SugarColumn(IsPrimaryKey =true)]//long类型的主键会自动赋值
   public long Id { get; set; }
  
   public string Name{get;set; }
}
long id= db.Insertable(实体).ExecuteReturnSnowflakeId();//单条插入返回雪花ID
List<Long> ids = db.Insertable(List<实体>).ExecuteReturnSnowflakeIdList();//多条插入批量返回,比自增好用

 1.2 导航插入 

在导航操作中如果主键是Long不赋值也会自动赋值雪花ID

 1.3 手动调用雪花ID

var id=SnowFlakeSingle.Instance.NextId();//也可以在程序中直接获取ID


2、雪花ID重复 问题

用雪花ID一定要设置WORKID , 只要静态变量SnowFlakeSingle不能共享的情况都要有独的WorkId

养成良好习惯服务器上的WorkId和本地不要一样,并且多服务器都要设置不一样的WorkId

//程序启时动执行一次就行
SnowFlakeSingle.WorkId= 唯一数字; //从配置文件读取一定要不一样
//服务器时间修改一定也要修改WorkId


//参数说明:
//workerId机器ID  2进制5位  32位减掉1位 31个
//datacenterId机房ID 2进制5位  32位减掉1位 31个

标注:SqlSugar自带雪花ID是成熟算法,正确配置WORKID无一例重复反馈,标题4也可以用自定义雪花算法


3、Javascript精度问题

方式1: 

精度long没有19位长度,所以序列化雪花ID时要序列化成string 

[Newtonsoft.Json.JsonConverter(typeof(ValueToStringConverter))] //JsonConverter的命名空间不要搞错了
[SugarColumn(IsPrimaryKey =true)] 
 public long Id { get; set; }
  
//配置API使用JSON.NET
//Nuget安装 Microsoft.AspNetCore.Mvc.NewtonsoftJson
   services.AddControllers().AddNewtonsoftJson(opt =>
   {
                //忽略循环引用
                opt.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
  
                //不改变字段大小
                opt.SerializerSettings.ContractResolver = new DefaultContractResolver(); 
    });

方式2:

使用短雪花ID,这个算法需要你自已提供,因为短雪花ID不成熟所以我不提供,如何将自定义算法

集成进SqlSugar看标题4

4、自定义雪花ID算法

如果你有好用的雪花ID组件用习惯了也可以使用你自个的算法(用自已的算法WorkId等都需要你的算法自已支持)

  //程序启动时执行一次就行
  StaticConfig.CustomSnowFlakeFunc = () =>
  {
      return 你的雪花ID方法();
  };

5、时间回退处理

系统因为临时故障引起的时间回退,一般就是几十毫秒,比如系统卡了等,可以用临时ID进行处理,不让程序报错,

默认是扔出错误

//程序启时动执行一次就行
var ran=new Random();
StaticConfig.CustomSnowFlakeTimeErrorFunc = () =>
 {
     return ran.Next(16, 18);//出现时间回退使用临时算法插入
 };

如果是人为调整就需要重启服务,不能长时间用自定义ID,或者修改workId

关闭
果糖网