我正在使用一个中等大小的 SQL Server 2008 数据库(大约 120 个表,备份压缩大约 4GB),其中所有表主键都声明为简单的 int 列。
目前,NHibernate 使用增量标识生成器生成主键值,该生成器迄今为止运行良好,但无法迁移到多处理环境。
系统上的负载正在增长,因此我正在评估允许使用多个服务器访问公共数据库后端所需的工作。
过渡到hi-lo生成器似乎是最好的方法,但我找不到很多关于这种迁移如何工作的细节。
NHibernate 会自动为我在 hi-lo 表中创建行,还是我需要手动编写这些脚本?
如果 NHibernate 确实自动插入行,它是否正确考虑了现有的键值?
如果 NHibernate 确实自动处理事情,那就太好了。如果没有,是否有任何工具可以提供帮助?
更新
NHibernate 的增量标识符生成器完全在内存中工作。它是通过从表中选择已用标识符的最大值来播种的,但从那时起,它会通过简单的增量分配新值,而不参考底层数据库表。如果任何其他进程向表中添加行,则最终会导致主键冲突。你可以在一个进程中运行多个线程就好了,但你不能运行多个进程。
相比之下,NHibernate身份生成器通过使用身份列配置数据库表来工作,将主键生成的控制权交给数据库。这很好用,但会损害工作单元模式。
hi-lo算法介于两者之间——主键的生成通过数据库进行协调,允许多处理,但实际分配可以完全在内存中进行,避免了工作单元模式的问题。