Вставка производительности NHibernate - PullRequest
7 голосов
/ 13 ноября 2008

Я провожу некоторые тесты с помощью nhibernate и модифицирую batch_size, чтобы получить массовые вставки.

Я использую mssql2005 и использую базу данных Northwind. Я создал 1000 объектов и вставил их в базу данных. Я изменил значения batch_size с 5 на 100, но не обнаружил изменений в производительности. Я получаю значение около 300 мс. Используя SQL Server Profiler, я вижу, что 1000 SQL операторов вставки на стороне сервера. Пожалуйста, помогите.

app.config

 <property name="adonet.batch_size">10</property>

код

    public bool MyTestAddition(IList<Supplier> SupplierList)
    {
        var SupplierList_ = SupplierList;
        var stopwatch = new Stopwatch();
        stopwatch.Start();
        using (ISession session = dataManager.OpenSession())
        {  
            int counter = 0;
            using (ITransaction transaction = session.BeginTransaction())
            {

                foreach (var supplier in SupplierList_)
                {
                    session.Save(supplier);                       
                }
               transaction.Commit(); 
            }

        }
        stopwatch.Stop();
        Console.WriteLine(string.Format("{0} milliseconds. {1} items added",
                            stopwatch.ElapsedMilliseconds,
                            SupplierList_.Count));
        return true;
    }

Ответы [ 5 ]

3 голосов
/ 26 ноября 2008

Ниже приведен отличный пост о пакетной обработке в Hibernate, на котором и основывается NHibernate:

http://relation.to/Bloggers/BatchProcessingInHibernate

Как видите, предлагаемые действия - установить разумный размер пакета в конфигурации, который вы сделали, но также вызывать session.flush() и session.clear() каждые 20 или около того записей.

Мы сами использовали этот метод и теперь можем создавать и сохранять более 1000 объектов за считанные секунды.

2 голосов
/ 20 января 2009

Можно загрузить целевой тип в список, а затем вызвать System.Data.SqlClient.BulkCopy, чтобы скопировать данные в целевую таблицу.

Это позволит обрабатывать большие объемы.

0 голосов
/ 23 ноября 2008

Согласно этой записи nhusers , вы видите, что 1000 вставок на SQL-сервере не должны иметь большого значения, потому что оптимизация выполняется на другом уровне. Если у вас действительно нет прироста производительности, попробуйте самую последнюю версию NHibernate, возможно, поможет указание на разрешение.

0 голосов
/ 26 ноября 2008

Я пробовал подобные вещи с nh, никогда не получал отличную производительность. я помню, как выполнял сброс каждые 10 записей и фиксацию каждые 50 записей, чтобы повысить производительность, так как с каждой вставкой процесс становился все медленнее. Это действительно зависит от размера объекта, поэтому вы можете играть вокруг этих чисел, возможно, вы сможете выжать из него какую-то производительность.

0 голосов
/ 17 ноября 2008

Звонок в ITransaction.Commit очистит вашу сессию, эффективно записав ваши изменения в базу данных. Вы вызываете Commit после каждого сохранения, поэтому для каждого поставщика будет ВСТАВКА.

Я бы попробовал вызывать Commit после каждых 10 поставщиков или около того, или, может быть, даже в конце ваших 1000 поставщиков!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...