如何使用nhibernate更快地插入?

时间:2011-03-23 14:40:54

标签: .net oracle nhibernate insert

我需要在oracle数据库中插入100万个对象,现在需要花费很多时间来完成这项工作,如何在数据库中更快地插入这个对象?

我正在使用此代码执行此操作:

using (ISession session = NHibernateHelper.OpenSession())
{
  using (ITransaction tranx = session.BeginTransaction())
  {
     session.Save(movimientoPendiente);
     tranx.Commit();
  }
}

感谢您的帮助。

3 个答案:

答案 0 :(得分:4)

使用无状态会话并在同一事务中执行所有插入操作:

using (var session = NHibernateHelper.GetSessionFactory().OpenStatelessSession())
using (var tranx = session.BeginTransaction())
{
    for(...)
    {
        var movimientoPendiente = ...;
        session.Insert(movimientoPendiente);
    }

    tranx.Commit();
}

答案 1 :(得分:2)

通常,ORM不适用于ETL样式的工作,例如加载1m记录。他们所做的花哨的东西,比如变化跟踪,在那里很丢失,并且几乎不需要开销。直接淘汰ADO.NET是你的朋友。

但如果您使用一个会话和一个事务处理多个记录,那么它可能会有所帮助:

using (ISession session = NHibernateHelper.OpenSession())
using (ITransaction tranx = session.BeginTransaction())
{
     foreach (var rec in MyRecords)
     {
        session.Save(movimientoPendiente);
     }
     tranx.Commit();
}

这至少意味着你每次发送记录时都不会构建一个有点昂贵的会话并烧掉相当昂贵的交易。

答案 2 :(得分:0)

使用单个会话,而不是为每个记录创建与数据库的新连接。 Jimmy Bogard写了a good blog post关于使用NHibernate进行批量处理的内容。