场景:Hi/Lo 初始化为MyEntity
Lo 100
桌子是空的。
具有不同连接的两个会话都插入了三个项目。
表 ID
1
2
3
100
101
102
如果第三个稍后进来并插入三个项目:
表 ID
...
200
201
202
有没有办法不让这些差距?
场景:Hi/Lo 初始化为MyEntity
Lo 100
桌子是空的。
具有不同连接的两个会话都插入了三个项目。
表 ID
1
2
3
100
101
102
如果第三个稍后进来并插入三个项目:
表 ID
...
200
201
202
有没有办法不让这些差距?
Lo 值是针对 SessionFactory 而不是 Session 存储的。只有在重新启动应用程序并创建 SessionFactory 的新实例时才会出现间隙。
从数据库中提取一个新的 Hi 值并将其存储在 SessionFactory 中,因此,如果您有一个网络农场,每个站点都将拥有自己的 SessionFactory 实例,每个实例都有自己的数据库中的“下一个”Hi 值。当 Lo 值用完时,它会将 Hi 更新为数据库中下一个可用的 Hi。
编辑:
如果您有客户端应用程序,那么我建议您根本不使用 HiLo,而是使用 GuidComb,它是一个顺序 Guid,您不会遇到间隙问题。
但是,由于它是一个现有的应用程序,并且您不能真正更改标识符,因此我建议要求客户端应用程序通过具有自己的 SF 的 Web 服务插入,这样您就可以维护单个 Hi 而不是每个客户端的多个 Hi应用程序。
如果你不能做到这一点,那么你将不得不降低你的 Lo。
正如Phill
非常正确地指出的那样,当您构建时会出现差距,sessionFactory
例如应用程序重新启动等,或者您在云上运行并且每个节点都有自己的一组Hi
and lo
。
您可以将 lo 减少到10
而不是100
减少差距和/或我建议使用 int64
而不是int32
为了方便起见。
然而,这些差距真的很重要吗?你会看到自己用完了吗?
在使用Hilo
. 我唯一看到的是有些人抱怨他们在使用int32
时或lo
设置为高时会耗尽。