首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NHibernate HiLo的解释

NHibernate HiLo的解释
EN

Stack Overflow用户
提问于 2010-04-29 15:41:08
回答 4查看 14.9K关注 0票数 35

我很难理解HiLo生成器是如何在NHibernate中工作的。我读过here的解释,它使事情变得更清楚了。

我的理解是,每个SessionFactory都从数据库中检索高值。这提高了性能,因为我们可以访问ID而不访问数据库。

上述链接的解释还指出:

例如,假设您有一个当前值为35的“高”序列,并且“低”数字在0-1023范围内。然后客户端可以将序列增加到36 (其他客户端可以在使用35时生成密钥),并知道键35/0、35/1、35/2、35/3.35/1023已全部备妥。

在web应用程序中,这是如何工作的,因为我只有一个SessionFactory,因此只有一个hi值。这是否意味着在断开连接的应用程序中,实体表中最终会出现重复(低) ids?

在我的测试中我使用了以下设置:

代码语言:javascript
复制
<id name="Id" unsaved-value="0">
  <generator class="hilo"/>
</id>

我运行了一个测试来保存100个对象。我桌子上的身份证从32768到32868。下一个hi值增加到2,然后我再次运行测试,Ids在65536 - 65636范围内。

首先,为什么从32768开始,而不是1;其次,为什么从32868跳到65536?

现在我知道我的代理密钥不应该有任何意义,但是我们确实在我们的应用程序中使用它们。为什么我不能让它们像Server标识字段那样很好地增加。

最后,有人能解释一下max_lo参数是如何工作的吗?这是否是可以针对高值创建的低值(我的头脑中的实体in )的最大数量?

这是NHibernate中我很难找到文档的一个主题。我在行动书中阅读了整个NHibernate,但它仍然没有详细说明它是如何工作的。

谢谢本

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-05-09 23:30:36

我相信你的理解或多或少是正确的。max_lo参数仅用于确定任何给定的Hi值可用的Ids数。

我最好的猜测是,NHibernate的缺省max_lo值是32768。因此,Hi值为1将从32768开始您的Ids,并直接运行到65535。Hi值为2将从65536开始,并运行另一个max_lo Ids。

基本上,您可以使用max_lo值来控制Id碎片。32768很可能不是每个情况下的最佳值。

但是,需要注意的是,这只在SessionFactory的范围内起作用。如果您停止/启动您的应用程序并重新初始化整个SessionFactory,它将在启动时增加Hi值,您将看到您的Ids跳得非常快。

票数 23
EN

Stack Overflow用户

发布于 2011-08-16 20:37:21

查看我的Nhibernate 3 HiLo对象生成的密钥,算法如下:(Hi * Lo) + Hi

因此,对于DB中的Hivalue作为390,以及我的配置如下:

代码语言:javascript
复制
<id name="TimeclockId" column="TimeclockId" type="Int64" unsaved-value="0">
      <generator class="hilo">
        <param name="where">TableId = 1</param>
        <param name="table">HiValue</param>
        <param name="column">NextValue</param>
        <param name="max_lo">10</param>
      </generator>
    </id>

我重新启动我的应用程序池,得到(390 * 10) + 390 = 4290,范围为4290-4300。

这就是为什么在主键中出现看似奇怪的空白的原因,因为下一个从hi值391生成的键是4301,范围是4301-4311。

票数 9
EN

Stack Overflow用户

发布于 2016-10-07 16:01:38

对于那些想知道如何选择一个好的max_lo值的人,主要是在以下几个方面进行权衡:

  • 频率,您需要用它从db.
  • 中查询一个新的hi值,最大数量的唯一数字实际上是可以生成的.

较低的max_lo将确保不存在id的“浪费”,这反过来决定了您将达到数据类型的隐式限制(可能是int)的时刻。您所付出的代价是每个客户端需要更频繁地查询和增加hi值。

更高的max_lo有助于减少获取和增加hi的查询频率,但会导致更多的浪费。

要确定最优值,需要考虑的指标如下:

创建新实体并需要ID SessionFactory) (应用程序重新启动/回收的ID

  • 频率)的
  • 频率(任何导致新NHibernate NHibernate的频率)

让我们考虑一个托管在IIS中并每24小时回收一次的web应用程序。实体是CustomerOrder

现在让我们假设:

每24小时

  • 10000新订单
  • 10新客户24小时

那么,完美的max_lo是订单的10000和客户的10。当然,在现实世界中,你永远无法如此精确和清晰地确定它,但你应该在这里得到这个想法!

现在,让我们考虑不同的场景,我们选择完全错误(荒谬)的max_lo

假设每秒钟有10个客户同时下订单,而订单上只有10个,那么每秒钟都会有一个额外的数据库调用来增加hi.

  • Suppose --您的应用程序是一个桌面应用程序,安装在50个客户端(支持人员?)上,每个客户端每天启动两次。他们加在一起每天创造大约100张求助券。现在,假设我们坚持max_lo默认的32767。Hi每天递增100次(50个客户机* 2),这意味着您将在不到2年内达到int的最大值,如果您忘记了hi经常递增这一重要事实的话。这里一个好的max_lo应该是(100张票/50个客户)= 2.

希望这有助于概念化HiLo算法及其一般含义,同时也为您提供了在max_lo上实际粘贴一个数字的数学。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2738671

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档