2012-07-06 59 views
3

我试图在数据库中插入大量的NHibernate数据,并且这样做非常缓慢。我已经仔细阅读过,并且无处不在的建议是让NH设置该行的标识,以便它可以批量处理,而不需要在插入后调用SCOPE_IDENTITY,但是,它是一个带遗留数据库的brownfield应用程序,让NHibernate控制行的标识。使用NHibernate在数据库表中插入行,而不会在插入行后调用scope_identity

有什么办法可以告诉NH只是不选择范围标识,只是将行插入到数据库中?我不需要它知道他们的身份,所以插入后这些行是否知道他们的身份没有什么区别,但我猜我不能告诉Nhibernate不要检索身份这个案例?

使用Fluent NH如果这是任何后果。

在此先感谢。

+0

这真的是个问题吗? SCOPE_IDENTITY应该是一个会话属性,不需要执行任何数据库操作,例如写入数据和更新表索引 - 它可能需要额外往返数据库,但这就是它,与其他所有操作相比,它应该相对便宜。为什么这会显着减少插入速度? – Rup 2012-07-06 11:38:00

+0

@rup是的,它非常相关。 db生成的密钥会阻止nhibernate使用批处理功能。最后,这不是scope_identity这样的问题,但scope_identity是每个插入后,使批量插入不可接受的缓慢 – Eddy 2012-07-06 11:49:08

+0

@Eddy基本上是耶。这是在将NHibernate设置为SQL命令之前屈服于NHibernate的绝望尝试。 – 2012-07-06 11:52:12

回答

3

NH需要标识来管理缓存中的实体以识别它们。所以我认为没有办法。

您的表现问题不一定是由身份造成的。这可能是你多次刷新会话。尝试关闭自动刷新以验证它或使用StatelessSession。

ORM在大型集体操作中不是很好。你应该考虑使用更低级的东西(比如SQL)。

+0

我正在使用正在创建的无状态会话,并仅为此一个查询进行处理,并试图将20K +记录插入到数据库中。由于数据库正在生成身份标识,因此查询中没有批处理发生,所以我得到了20K +个人插入和范围标识语句,这意味着插入速度非常慢。我知道这违背了NH的所有原则,但由于我必须尝试使用​​它,我想知道是否有人知道我可以使用的一些巫术。我意识到这是一个远投。 – 2012-07-06 11:50:59