Asp.net mvc 2 NHibernate HiLo ID不足,导致出现负数

Asp.net mvc 2 NHibernate HiLo ID不足,导致出现负数,asp.net-mvc-2,fluent-nhibernate,hilo,Asp.net Mvc 2,Fluent Nhibernate,Hilo,我们正在运行一个ASP.NET数据库应用程序,它使用HiLo为实体生成ID。在这个应用程序之上,我们有几个网站使用同一个数据库。我们看到的是,ID用完了,ID列变成了负数 我们怀疑这与发电机有关。由于多个网站在同一个代码库和数据库上运行,可能HiLo算法很快开始生成超出bigint范围的ID(当然是相对的) 是否可以将生成器配置为同时使用Id序列中的间隙(其中有很多间隙),而不是在必要时直接增加值 这是一个解决方案吗?或者我们应该一起做其他事情吗?如果可能,您可以切换到Guid.Comb生成器,

我们正在运行一个ASP.NET数据库应用程序,它使用HiLo为实体生成ID。在这个应用程序之上,我们有几个网站使用同一个数据库。我们看到的是,ID用完了,ID列变成了负数

我们怀疑这与发电机有关。由于多个网站在同一个代码库和数据库上运行,可能HiLo算法很快开始生成超出bigint范围的ID(当然是相对的)

是否可以将生成器配置为同时使用Id序列中的间隙(其中有很多间隙),而不是在必要时直接增加值


这是一个解决方案吗?或者我们应该一起做其他事情吗?

如果可能,您可以切换到Guid.Comb生成器,或者使用int64作为ID。看看如何最终决定使用哪种发电机。

我遇到了同样的问题,也没有找到合适的答案

我们还有一个网站,它作为独立的网站运行,每个网站都在自己的独立应用程序池中,都在同一个Web服务器上

实际上,如果您的数据库支持身份映射,您最好切换到身份映射。这应该不会太难做到,您应该能够用一点TSQL修改数据库模式,用一点搜索/替换修改ID映射

您的应用程序中是否有类似于UoW的概念?因为标识生成的一个缺点是它会破坏UoW(为了获取标识符而提前插入)。不过,这可能是一个值得付出的代价


在我的例子中,系统可以很容易地作为单个站点/应用程序池存在(它是单个数据库上的多租户,具有单个共享连接字符串,并且设计为在Web服务器上作为单个实例运行),因此在跳转到数据库标识之前,我将测试这一点。

您的最大值设置为多少? 生成id的公式如下所示

h=高顺序(从0开始) l_尺寸=低块尺寸 l=低顺序(从1开始)

ID=h*l\U尺寸+l


可能您的最大lo设置为高?

我们决定先切换到Int64,然后切换到GUID.comb,因为我们预计当前的设置与HiLo的工作方式不兼容,即使使用Int64,我们的ID也会用完。这不是因为我们有大量的数据,而是因为我们有时需要重新启动应用程序,并且我们有多个应用程序池,这会导致ID快速增加。