Как можно быстрее вставить с помощью nhibernate? - PullRequest
1 голос
/ 23 марта 2011

Мне нужно вставить 1 миллион объектов в базу данных оракула, сейчас для выполнения этой работы требуется так много времени, как я могу быстрее вставить этот объект в базу данных?

Я использую этот код для этого:

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

Спасибо за вашу помощь.

Ответы [ 3 ]

4 голосов
/ 23 марта 2011

Используйте сеанс без сохранения состояния и выполните все вставки в одной транзакции:

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

    tranx.Commit();
}
2 голосов
/ 23 марта 2011

В общем случае ORM не предназначены для работы в стиле ETL, например, для загрузки записей 1м.Модные вещи, которые они делают, такие как отслеживание изменений, там довольно утеряны и в большинстве своем не нужны.ADO.NET - ваш друг здесь.

Но это, вероятно, поможет, если вы используете одну сессию и одну транзакцию для более чем одной записи:

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

Это по крайней мере означает, что вымы не создаем довольно дорогой сеанс и не сжигаем довольно дорогую транзакцию каждый раз, когда вы отправляете запись.

0 голосов
/ 23 марта 2011

Используйте один сеанс вместо создания нового подключения к базе данных для каждой из ваших записей. Джимми Богард написал хорошее сообщение в блоге о массовой обработке с использованием NHibernate.

...