场景:使用Lo 100 1>为MyEntity
初始化Hi / Lo
表格为空。
两个具有不同连接的会话都插入了三个项目。
TableIds
1
2
3
100
101
102
如果第三个进入以后并插入三个项目:
TableIds
...
200
201
202
有没有办法解决这些差距?
答案 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
时,会出现间隙。应用程序重新启动等,或者您在云上运行,每个节点都有自己的Hi
和lo
。
你可以减少10
而不是100
以减少差距和/或我建议使用int64
而不是int32
以便于放心。
然而差距实际上重要吗?你会看到自己快跑了吗?
在使用Hilo
时,我从来没有读过任何关于性能(数据库问题)的负面信息。我唯一看到的是有些人抱怨在使用int32
或lo
设置为高时它们用完了。