【问题标题】:NHibernate Hi/Lo - gaps in idsNHibernate Hi/Lo - id 中的空白
【发布时间】:2011-05-04 08:50:37
【问题描述】:

场景:Hi/Lo 为 MyEntity 初始化,Lo 100

桌子是空的。

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

表格编号

1
2
3
100
101
102

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

表格编号

...
200
201
202

有没有办法消除这些差距?

【问题讨论】:

  • 几乎所有“顺序”分配方法在某些情况下都会产生间隙(或会产生性能瓶颈)。最好对存在这些差距的任何问题进行重新工作。
  • 您是否在开发机器上工作(应用程序一直在停止启动)?如果您保持应用程序处于后台运行状态,这在生产中可能不会成为问题。您还可以将每次在配置中使用的数量减少到例如10 这将在一定程度上缓解问题。

标签: nhibernate hilo


【解决方案1】:

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

从数据库中提取一个新的 Hi 值并将其存储在 SessionFactory 中,因此,如果您有一个网络农场,每个站点都会有自己的 SessionFactory 实例,每个实例都有自己的数据库中的“下一个”Hi 值.当 Lo 值用完时,它会将 Hi 更新为数据库中下一个可用的 Hi。

编辑:

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

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

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

【讨论】:

  • 目前我们有一个 SF 用于 webapp,一个 SF 用于服务,X SF 用于客户端,MaxLo = 100。webapp 和服务没有什么大不了的,但是每个客户端连接都会导致很多我看到的差距。想法,想法?也许为客户关闭它?
  • @Daniel - 根据您的评论更新了我的答案。
  • 路径已经选择了身份。当然,可以通过“一点工作”做出改变。正如您所建议的,我也会使用通用服务层走这条路。但如果这不是一个选择......?
  • @Daniel - 听起来您根本没有太多选择。不要忘记,Int32 有 2,147,483,647 个数字。我怀疑即使你有差距,你也会用完值,除非你有 100 个客户端应用程序正在运行并且每天重新启动多次,那么就有可能使用所有这些有效数字。
【解决方案2】:

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

您可以将 lo 减少到 10 而不是 100 以减少差距和/或我建议使用 int64 而不是 int32 以方便使用。

但是这些差距真的很重要吗?你会看到自己用完了吗?

在使用Hilo 时,我从未读过任何关于性能(数据库问题)的负面信息,其中存在大量差距。我看到的唯一情况是有人抱怨在使用int32 或将lo 设置为高时会耗尽。

【讨论】:

  • 不使用 int32。当 100 已经被使用时,从 100 变为 10。有什么问题,提示吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-21
  • 2011-01-20
  • 1970-01-01
相关资源
最近更新 更多