NHibernate Hi / Lo - ID中的空白

时间:2011-05-04 08:50:38

标签: nhibernate hilo

场景:使用Lo 100 MyEntity初始化Hi / Lo

表格为空。

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

TableIds

1
2
3
100
101
102

如果第三个进入以后并插入三个项目:

TableIds

...
200
201
202

有没有办法解决这些差距?

2 个答案:

答案 0 :(得分:4)

Lo值是针对SessionFactory存储的,而不是Session。只有在重新启动应用程序并创建SessionFactory的新实例时,才会遇到空白。

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

修改

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

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

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

答案 1 :(得分:2)

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

你可以减少10而不是100以减少差距和/或我建议使用int64而不是int32以便于放心。

然而差距实际上重要吗?你会看到自己快跑了吗?

在使用Hilo时,我从来没有读过任何关于性能(数据库问题)的负面信息。我唯一看到的是有些人抱怨在使用int32lo设置为高时它们用完了。