【SqlSugar雪花ID常见问题】.NET开源ORM框架 SqlSugar 系列

系列文章目录

🎀🎀🎀 .NET开源 ORM 框架 SqlSugar 系列 🎀🎀🎀


文章目录

  • 系列文章目录
  • [一、前言 🍃](#一、前言 🍃)
  • [二、ORM中使用雪花ID ❄️](#二、ORM中使用雪花ID ❄️)
    • [2.1 普通插入](#2.1 普通插入)
    • [2.2 导航插入](#2.2 导航插入)
    • [2.3 手动调用雪花ID](#2.3 手动调用雪花ID)
  • [三、雪花ID重复 问题 🔁](#三、雪花ID重复 问题 🔁)
  • 四、Javascript精度问题
    • [4.1 方案1](#4.1 方案1)
    • [4.2 方案2](#4.2 方案2)
  • [五、自定义雪花ID算法 🎨](#五、自定义雪花ID算法 🎨)
  • [六、时间回退处理 🔙](#六、时间回退处理 🔙)
  • [🎀🎀🎀 .NET开源 ORM 框架 SqlSugar 系列 🎀🎀🎀](#🎀🎀🎀 .NET开源 ORM 框架 SqlSugar 系列 🎀🎀🎀)

一、前言 🍃

雪花算法 (Snowflake)是一种用于生成唯一标识符(ID)的分布式算法。它可以生成趋势递增且具有一定时间顺序的 64 位整数,适用于分布式系统中的唯一 ID 生成需求。下面将介绍雪花ID在 SqlSugar 中的用法。

二、ORM中使用雪花ID ❄️

2.1 普通插入

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

csharp 复制代码
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();//多条插入批量返回,比自增好用

2.2 导航插入

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

2.3 手动调用雪花ID

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

三、雪花ID重复 问题 🔁

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

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

csharp 复制代码
//程序启时动执行一次就行
SnowFlakeSingle.WorkId= 唯一数字; //从配置文件读取一定要不一样
//服务器时间修改一定也要修改WorkId
 
//参数说明:
//workerId机器ID  2进制5位  32位减掉1位 31个
//datacenterId机房ID 2进制5位  32位减掉1位 31个

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

四、Javascript精度问题

4.1 方案1

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

csharp 复制代码
[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(); 
    });

4.2 方案2

使用短雪花ID,这个算法需要你自已提供,因为短雪花ID不成熟所以我不提供,如何将自定义算法集成进SqlSugar看标题5。

五、自定义雪花ID算法 🎨

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

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

六、时间回退处理 🔙

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

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

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

🎀🎀🎀 .NET开源 ORM 框架 SqlSugar 系列 🎀🎀🎀

【开篇】.NET开源 ORM 框架 SqlSugar 系列
【入门必看】.NET开源 ORM 框架 SqlSugar 系列
【实体配置】.NET开源 ORM 框架 SqlSugar 系列
【Db First】.NET开源 ORM 框架 SqlSugar 系列
【Code First】.NET开源 ORM 框架 SqlSugar 系列
【数据事务】.NET开源 ORM 框架 SqlSugar 系列
【连接池】.NET开源 ORM 框架 SqlSugar 系列
【查询目录】.NET开源 ORM 框架 SqlSugar 系列
【查询基础】.NET开源 ORM 框架 SqlSugar 系列
【排序用法】.NET开源 ORM 框架 SqlSugar 系列
【分组去重】.NET开源 ORM 框架 SqlSugar 系列
【联表查询】.NET开源 ORM 框架 SqlSugar 系列
【导航查询】.NET开源 ORM 框架 SqlSugar 系列
【子查询】.NET开源 ORM 框架 SqlSugar 系列
【嵌套查询】.NET开源 ORM 框架 SqlSugar 系列
【配置查询】.NET开源 ORM 框架 SqlSugar 系列
【并集查询】.NET开源 ORM 框架 SqlSugar 系列
【树型查询】.NET开源 ORM 框架 SqlSugar 系列
【表格查询】.NET开源 ORM 框架 SqlSugar 系列
【动态表达式】.NET开源 ORM 框架 SqlSugar 系列
【查询函数】.NET开源ORM框架 SqlSugar 系列
【过滤器】.NET开源 ORM 框架 SqlSugar 系列
【跨库查询、多库查询】.NET开源 ORM 框架
​【报表查询】.NET开源ORM框架 SqlSugar 系列
【Where语法全解密】.NET开源ORM框架 SqlSugar 系列
【Select 语法全解密】.NET开源ORM框架 SqlSugar 系列

相关推荐
檀越剑指大厂2 小时前
【SQL系列】多表关联更新
数据库·sql
DoorToZen4 小时前
理解 `.sln` 和 `.csproj`:从项目结构到构建发布的一次梳理
经验分享·笔记·其他·前端框架·c#·.net
gadiaola9 小时前
MySQL从入门到精通(三):MySQL数据类型、SQL语言—DDL
数据库·sql·mysql·database
山猪打不过家猪11 小时前
(二)毛子整洁架构(CQRS/Dapper/领域事件处理器/垂直切片)
开发语言·.net
狗屁不会还不知上进的咸鱼14 小时前
obj = null; 赋值null之前没有其他引用指向obj对象,那么,当obj=null时,会被垃圾回收机制立即回收吗?
.net
步、步、为营17 小时前
.NET中使用HTTPS全解析
数据库·https·.net
GUIQU.19 小时前
【MySQL】SQL简述
数据库·sql·mysql
WikeSoft21 小时前
.net core workflow流程定义
.net·.net core·workflow·流程引擎·工作流
zfj32121 小时前
用java实现一个简单的sql select 解析器,无需第三方依赖,完全从0开始
java·sql
qq_366086221 天前
sql serve 多表联合查询,根据一个表字段值动态改变查询条件
数据库·sql