我正在使用nhibernate进行一些测试,我正在修改batch_size以获得批量插入。
我正在使用mssql2005并使用northwind db。 我创建了1000个对象并将它们插入到数据库中。我已将batch_size的值从5更改为100,但未发现性能有任何变化。我的价值大约是300毫秒。使用sql profiler,我在服务器端看到1000个sql insert语句。请帮忙。
<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;
}
答案 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!