【发布时间】:2010-04-29 15:41:08
【问题描述】:
我正在努力弄清楚 HiLo 生成器在 NHibernate 中的工作原理。我已经阅读了here 的解释,这让事情变得更清楚了。
我的理解是每个 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。然后我再次运行测试,ID 在 65536 - 65636 范围内。
首先,为什么从 32768 而不是 1 开始,其次为什么从 32868 跳到 65536?
现在我知道我的代理键不应该有任何意义,但我们确实在我们的应用程序中使用它们。为什么我不能像 SQL Server 标识字段那样让它们很好地递增。
最后谁能给我解释一下 max_lo 参数是如何工作的?这是可以针对高值创建的低值(我脑海中的实体 ID)的最大数量吗?
这是 NHibernate 中的一个主题,我一直在努力寻找文档。我阅读了整本 NHibernate in action book,但仍然没有详细介绍它的工作原理。
谢谢 本
【问题讨论】:
标签: .net nhibernate