NHibernate Hi/Lo - gaps in ids



场景:用lo100初始化MyEntity的Hi/Lo

表为空

具有不同连接的两个会话都插入了三个条目。

TableIds

1
2
3
100
101
102

如果第三个人稍后进来并插入三个条目:

TableIds

...
200
201
202

有没有办法不得到这些差距?

Lo值是根据SessionFactory而不是根据Session存储的。只有在重新启动应用程序并创建SessionFactory的新实例时才会出现间隙。

一个新的Hi值是从数据库中提取并存储在SessionFactory中,所以如果你有一个web farm,每个站点将有它自己的SessionFactory实例,每个站点将有它自己的'下一个'来自数据库的Hi值。当它用完Lo值时,它将把Hi更新为数据库中下一个可用的Hi。

编辑:

如果你有客户端应用程序,那么我建议根本不要使用HiLo,而是使用GuidComb,它是一个顺序的Guid,你不会有间隙的问题。

由于它是一个现有的应用程序,然而,你不能真正去改变标识符,我建议要求客户端应用程序通过一个Web服务,它有自己的SF插入,这样你可以维护一个单一的Hi,而不是多个Hi每个客户端应用程序。

如果你不能做到这一点,那么你将不得不降低你的Lo。

正如Phill非常正确地指出,当您构建sessionFactory时出现差距,例如应用程序重新启动等,或者您在云上运行,每个节点都有自己的Hilo集。

您可以将lo减少到10而不是100以减少差距,并且/或者我建议使用int64而不是int32,以便放心。

然而,差距实际上很重要吗?你有没有想过自己会耗尽精力?

在使用Hilo时,我从来没有读过任何关于性能(数据库问题)的负面信息。我所看到的唯一一件事是,有些人抱怨,当使用int32或当lo已设置为高时,他们跑了。

最新更新