NHibernate性能插入

时间:2008-11-13 09:56:32

标签: nhibernate

我正在使用nhibernate进行一些测试,我正在修改batch_size以获得批量插入。

我正在使用mssql2005并使用northwind db。 我创建了1000个对象并将它们插入到数据库中。我已将batch_size的值从5更改为100,但未发现性能有任何变化。我的价值大约是300毫秒。使用sql profiler,我在服务器端看到1000个sql insert语句。请帮忙。

的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 个答案:

答案 0 :(得分:3)

以下是Hibernate中关于批处理的一篇很棒的文章,这是NHibernate基于并紧密遵循的内容:

http://relation.to/Bloggers/BatchProcessingInHibernate

如您所见,建议的操作是在您已完成的配置中设置合理的批量大小,但也要每20个左右的记录调用session.flush()session.clear()

我们自己采用了这种方法,现在可以在几秒钟内创建并保存1000多个对象。

答案 1 :(得分:2)

您可以将目标类型加载到List,然后调用System.Data.SqlClient.BulkCopy将数据bcp到目标表中。

这样可以处理更大的数量。

答案 2 :(得分:0)

根据this nhusers post,您在SQL Server中看到1000个插入应该不重要,因为优化是在不同的级别上完成的。如果你真的没有性能上的提升,尝试最新版本的NHibernate可能有助于指出解决方案。

答案 3 :(得分:0)

我尝试过类似的东西,从来没有真正表现出色。我记得每10个条目做一次刷新,每50个条目提交一次,以获得性能提升,因为每次插入过程都会慢慢变慢。它实际上取决于物体的大小,所以你可以用这些数字来玩它们,也许你可以从中挤出一些性能。

答案 4 :(得分:-2)

对ITransaction.Commit的调用将刷新您的会话,有效地将您的更改写入数据库。您在每次保存后都会调用Commit,因此每个供应商都会有一个INSERT。

我会尝试在每10个供应商之后调用Commit,或者甚至在1000个供应商结束时调用Commit!