我很努力想知道HiLo生成器如何在NHibernate中工作。我读过解释here,这使得事情更清晰一些。NHibernate HiLo的解释
我的理解是每个SessionFactory都会从数据库中检索到较高的值。这可以提高性能,因为我们可以在不碰到数据库的情况下访问ID。
从上述链接的解释也指出:
例如,假设你有35的电流值的“高”序列,和“低”数的范围是0-1023 。然后,客户端可以将序列增加到36(对于其他客户端在使用35时能够生成密钥),并且知道35/0,35/1,35/2,35/3 ... 35/1023的密钥是全部可用。
这是如何在Web应用程序中工作的,因为我只有一个SessionFactory,因此只有一个Hi值。这是否意味着在断开连接的应用程序中,实体表中可能会出现重复(低)ID?
在我的测试中,我将会使用这些设置:
<id name="Id" unsaved-value="0">
<generator class="hilo"/>
</id>
我跑的测试,以节省100个对象。我表中的ID从32768 - 32868开始。下一个hi值增加到2.然后我再次运行我的测试,Ids在65536-65636范围内。
首先,为什么从32768开始,而不是1,其次是为什么从32868跳到65536?
现在我知道我的代理键应该没有任何意义,但我们在我们的应用程序中使用它们。为什么我不能让它们像SQL Server身份字段那样很好地增加。
终于有人能给我一个解释max_lo参数是如何工作的?这是低价值的最大数量(我头脑中的实体标识),可以根据高价值创建吗?
这是NHibernate的一个主题,我一直在努力寻找文档。我在行动书中阅读了整个NHibernate,但它仍然没有详细讨论它的工作原理。
感谢 本
感谢您的解释。 – 2010-05-10 11:34:20
默认的max_lo值是java short.MAX_VALUE == 2^15-1 = 32767 – kommradHomer 2012-03-08 15:19:43