gpt4 book ai didi

.net - NHibernate HiLo的说明

转载 作者:行者123 更新时间:2023-12-03 08:30:15 27 4
gpt4 key购买 nike

我正在努力弄清楚HiLo生成器在NHibernate中的工作方式。我已经阅读了here的解释,这使事情变得更加清晰。

我的理解是,每个SessionFactory都从数据库中检索高值(value)。因为我们无需访问数据库即可访问ID,因此可以提高性能。

上述链接的说明还指出:

For instance, supposing you have a "high" sequence with a current value of 35, and the "low" number is in the range 0-1023. Then the client can increment the sequence to 36 (for other clients to be able to generate keys while it's using 35) and know that keys 35/0, 35/1, 35/2, 35/3... 35/1023 are all available.



这在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参数的工作原理吗?这是可以针对高值(value)创建的低值(value)(我脑海中的实体ID)的最大数量吗?

这是NHibernate中的一个主题,我一直在努力寻找相关文档。我阅读了整个NHibernate行动手册,但仍未深入了解它的工作原理。

谢谢

最佳答案

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

我最好的猜测是NHibernate的默认max_lo值是32768。因此,Hi值1将在32768处启动您的ID,然后将您运行到65535。Hi值2将在65536处开始并运行另一个max_lo Ids。

基本上,您可以使用max_lo值来控制ID分段。 32768可能不是每种情况的最佳值。

重要的是要注意,但这仅在SessionFactory的范围内有效。如果要停止/启动应用程序并重新初始化SessionFactory,无论如何它都会在启动时增加Hi值,并且您会看到ID迅速跳跃。

关于.net - NHibernate HiLo的说明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2738671/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com