3

我知道 NHibernate 不打算进行批量插入,因为它比 SqlBulkCopy 慢 5 倍,但我决定使用它来简化代码。

但是,我的代码并没有慢 5 倍。它慢了 2400 倍。我正在插入大约 2500 条记录。我已经关闭了 log4net 日志记录。我在发布模式下运行它。我没有使用 id 生成器(我通过整数计数器在代码中指定它)。我正在使用无状态会话。我将批量大小设置为 100(我可以做得更多,但似乎没有帮助)。我尝试重新添加生成器,但将其类设置为“已分配”。

我没有插入任何子元素。我已经确认批量插入正在发生。

它还在调用 SELECT SCOPE_IDENTITY() 吗?但即使是这样,这仍然是一个荒谬的时间。

我没有做太多的批处理操作,所以我可以继续使用 SqlBulkCopy 进行这个过程,但我担心我的整个应用程序可能运行得更快。

我没有 NHProf 的许可证,但我想知道现在是否可以下载试用版。

我将 NHibernate 3.3 GA 与 Syscache2 一起使用——但同样,我使用的是无状态会话。

您想查看任何 HBM、配置或代码吗?建议?

谢谢

4

3 回答 3

2

因为它比 SqlBulkCopy 慢大约 5 倍

你一定是在开玩笑。

NHibrnate 进行插入。使用批量插入(即一个命令中的多个插入语句),手写 - 我认为 NHibernate 不会这样做 - 我在一个特定项目中获得了大约 400 个插入。

使用 SqlBUlkCopy 我得到了 75000。

这不是 5 的因数,而是 187 的因数。

但是,我的代码并没有慢 5 倍。它慢了 2400 倍

不是 NHibernate 专家。记录连接 - 我假设 NHibernate 每批发送一个插入,这意味着处理速度很慢等,并且比我做的东西慢很多(我的文本开头)。

你到底是从哪里得到 5 倍系数的?这是一个错误的开始。

我没有做太多的批处理操作,所以我可以继续使用 SqlBulkCopy 进行这个过程,但我担心我的整个应用程序可能运行得更快。

这是一个现实检查:当您需要极高的选择或插入速度时,不要使用 ORM。它们用于业务规则重的对象 - 业务对象。当您最终进行批量插入或读取时,您不要使用完整的 ORM。就这么简单。

如果您认为 SqlBUlkCopy 很快,请检查: * 多个 SqlBulkCopy 在多个线程上运行... * ...对临时表进行惰性化,然后 * ...使用一个 insert into select 语句将数据复制到最终表。

为什么?因为 SqlBulkCopy 对多线程有一些不好的锁定行为。这就是我把它弄得那么高的原因。

并且: SqlBulkCopy 的 2500 行很低 - 设置开销很大(即在第 1 行之前)......所以你会得到更少的收益。我使用 50k 行批次。

NHibernate 在线级别上做了什么?

我已经确认批量插入正在发生。

如何?您如何看待批量插入?

桌上有触发器吗?

于 2012-06-08T05:59:14.490 回答
0

在我的 devmashine 上将 10000 个具有几个 long 和 string 属性的对象插入本地 mysql 数据库需要:

StatelessSession:  4,6 seconds
Session:           5,7 seconds
于 2012-06-12T06:45:20.403 回答
0

我发现如果您执行许多插入操作,一级缓存会阻塞并很快导致其缓慢爬行。您可以尝试使用无状态会话,或者只是定期打开和关闭会话,即每 5 次插入。通过关闭会话,您当然会丢失诸如交易之类的东西。

但最终,如果我有超过 100 行要插入,我倾向于使用 SqlBulkCopy,速度要快很多倍。

于 2012-06-12T06:51:07.993 回答