我很难理解HiLo生成器是如何在NHibernate中工作的。我读过here的解释,它使事情变得更清楚了。
我的理解是,每个SessionFactory都从数据库中检索高值。这提高了性能,因为我们可以访问ID而不访问数据库。
上述链接的解释还指出:
例如,假设您有一个当前值为35的“高”序列,并且“低”数字在0-1023范围内。然后客户端可以将序列增加到36 (其他客户端可以在使用35时生成密钥),并知道键35/0、35/1、35/2、35/3.35/1023已全部备妥。
在web应用程序中,这是如何工作的,因为我只有一个SessionFactory,因此只有一个hi值。这是否意味着在断开连接的应用程序中,实体表中最终会出现重复(低) ids?
在我的测试中我使用了以下设置:
<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,但它仍然没有详细说明它是如何工作的。
谢谢本
发布于 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跳得非常快。
发布于 2011-08-16 20:37:21
查看我的Nhibernate 3 HiLo对象生成的密钥,算法如下:(Hi * Lo) + Hi
因此,对于DB中的Hivalue作为390,以及我的配置如下:
<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。
发布于 2016-10-07 16:01:38
对于那些想知道如何选择一个好的max_lo值的人,主要是在以下几个方面进行权衡:
hi值,最大数量的唯一数字实际上是可以生成的.。
较低的max_lo将确保不存在id的“浪费”,这反过来决定了您将达到数据类型的隐式限制(可能是int)的时刻。您所付出的代价是每个客户端需要更频繁地查询和增加hi值。
更高的max_lo有助于减少获取和增加hi的查询频率,但会导致更多的浪费。
要确定最优值,需要考虑的指标如下:
创建新实体并需要ID SessionFactory) (应用程序重新启动/回收的ID
让我们考虑一个托管在IIS中并每24小时回收一次的web应用程序。实体是Customer和Order。
现在让我们假设:
每24小时
那么,完美的max_lo是订单的10000和客户的10。当然,在现实世界中,你永远无法如此精确和清晰地确定它,但你应该在这里得到这个想法!
现在,让我们考虑不同的场景,我们选择完全错误(荒谬)的max_lo:
假设每秒钟有10个客户同时下订单,而订单上只有10个,那么每秒钟都会有一个额外的数据库调用来增加hi.
max_lo默认的32767。Hi每天递增100次(50个客户机* 2),这意味着您将在不到2年内达到int的最大值,如果您忘记了hi经常递增这一重要事实的话。这里一个好的max_lo应该是(100张票/50个客户)= 2.。
希望这有助于概念化HiLo算法及其一般含义,同时也为您提供了在max_lo上实际粘贴一个数字的数学。
https://stackoverflow.com/questions/2738671
复制相似问题