2010-12-22 59 views
0

场景:使用NHibernate并行插入

需要将大量实体从集成数据库加载到生产数据库。我们使用NHibernate将东西加载到我们的prod数据库中,因为涉及的业务规则已经使用持久化实体在C#中编写。一切运行良好,我们将有效的实体加载到数据库中。 RDBMS是SQL Server 2005(可以升级到2008)。

问题:

实体的数量负荷将很快疯狂增长,我们非常肯定,这将需要比预期更长,无法满足客户的要求。

解决方案(?):

这是很容易简单地运行在平行的事情:拆分所有实体到水桶和平行进口。

问题是,它们全部插入到同一个表中,并且所有进程都会在表锁中遇到瓶颈。

所以问题是:有没有办法使这些插入的方式,不锁定表试图插入同一个表中的其他交易?我听说过快照隔离级别,但没有发现任何人使用它的真实。任何指导表示赞赏。

回答

1

是否可以插入到不同的表中(如上所述,每个“桶”一个)并将它们连接到一个视图中?除了加载时间下降80%外,客户不会看到任何区别...

1

我对NHibernate没有任何经验,但是从.NET中可以使用SqlBulkCopy并行批量加载数据(或者使用BULK INSERT/BCP)。在正在加载的表上应用TABLOCK,并且这些批量操作会在表上取出批量更新锁,并且如果您有两个具有批量更新锁的进程,它们将相处得很好。你需要加载到堆中(表中没有聚集索引)。

这是相反的,如果你有多个进程正在执行INSERT ... SELECT,例如它将获得独占的表级锁并因此会相互阻塞。

我推荐this MSDN article - 那里有更多的细节和信息。希望这种事情对你来说是可能的。

此外,如果可以,请在加载之前从表格中删除索引,然后重新创建它们 - 这将提高加载速度。

+0

的场景是微妙的,因为系统必须在保持在线批量加载 – Pedro 2010-12-22 19:28:06

2

我认为章节10.4 Optimistic concurrency control应该可以帮助你完成你的工作。您可以为此类型的插入定义明确的隔离级别。文章建议使用版本控制,但如果你不需要这个原因,你的数据只是插入,但没有更新,你可以跳过。在这种情况下,最后一次提交获胜

1

“做一两件事有正确的工具”

不要使用NHibernate的做批量插入,使用普通的ADO.NET命令和批量插入

+0

并且有重复的业务规则吗?不,谢谢 – Pedro 2010-12-22 19:21:55