首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何诊断缓慢的NHibernate插入?

如何诊断缓慢的NHibernate插入?
EN

Stack Overflow用户
提问于 2012-06-08 12:11:25
回答 3查看 1.5K关注 0票数 3

我知道NHibernate不是用来做批插入的,因为它比SqlBulkCopy慢5倍左右,但为了简化代码,我决定使用它。

然而,我的代码并没有慢5倍。它的速度要慢2400倍。我插入了大约2500条记录。我已经关闭了log4net日志记录。我在释放模式下运行它。我没有使用id生成器(我是通过整数计数器在代码中指定的)。我使用的是无状态会话。我已经将批处理大小设置为100 (我可以设置更多,但似乎没有帮助)。我试着重新添加生成器,但将它的类设置为"assigned“。

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

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

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

我没有NHProf的许可证,但我想知道现在是不是下载试用版的时候了。

我使用的是带有Syscache2的NHibernate 3.3GA --但同样,我使用的是无状态会话。

有没有想看的HBMs、配置或代码?有什么建议吗?

谢谢

EN

回答 3

Stack Overflow用户

发布于 2012-06-08 13:59:14

,因为它比SqlBulkCopy慢大约5倍

你一定是在开玩笑。

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

使用SqlBUlkCopy,我得到了75000。

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

然而,我的代码并没有慢5倍。它慢了2400倍

不是NHibernate专家。记录连接-我假设NHibernate每批发送一次插入,这意味着许多缓慢的处理等,并且比我做的事情(我的文本的开头)慢得多。

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

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

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

当你认为SqlBUlkCopy很快的时候,检查一下这个:*多个SqlBulkCopy运行在多个线程上...*插入到临时表中,然后* ...using一条insert into select语句,将数据复制到最终的表中。

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

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

NHibernate在连线级别上做了什么?

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

多么?你认为批量插入是什么?

桌子上有触发器吗?

票数 2
EN

Stack Overflow用户

发布于 2012-06-12 14:45:20

将具有两个long和string属性的10000个对象插入到我的devmashine上的本地mysql数据库中需要执行以下操作:

代码语言:javascript
复制
StatelessSession:  4,6 seconds
Session:           5,7 seconds
票数 0
EN

Stack Overflow用户

发布于 2012-06-12 14:51:08

我发现如果你做了很多插入,一级缓存会阻塞,很快就会让它慢下来,变成爬行。你可以尝试使用无状态会话,或者只是定期打开和关闭会话,即每5次插入一次。你当然会因为关闭会话而丢失一些东西,比如事务。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10942962

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档