我知道NHibernate不是用来做批插入的,因为它比SqlBulkCopy慢5倍左右,但为了简化代码,我决定使用它。
然而,我的代码并没有慢5倍。它的速度要慢2400倍。我插入了大约2500条记录。我已经关闭了log4net日志记录。我在释放模式下运行它。我没有使用id生成器(我是通过整数计数器在代码中指定的)。我使用的是无状态会话。我已经将批处理大小设置为100 (我可以设置更多,但似乎没有帮助)。我试着重新添加生成器,但将它的类设置为"assigned“。
我没有插入任何子元素。我已经确认批量插入正在发生。
它还在调用SELECT SCOPE_IDENTITY()吗?但即使是这样,这仍然是一个荒谬的时间。
我不会做太多的批处理操作,所以我可以继续使用SqlBulkCopy来处理这个过程,但是我担心我的整个应用程序会运行得更快。
我没有NHProf的许可证,但我想知道现在是不是下载试用版的时候了。
我使用的是带有Syscache2的NHibernate 3.3GA --但同样,我使用的是无状态会话。
有没有想看的HBMs、配置或代码?有什么建议吗?
谢谢
发布于 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在连线级别上做了什么?
我已经确认批量插入正在发生。
多么?你认为批量插入是什么?
桌子上有触发器吗?
发布于 2012-06-12 14:45:20
将具有两个long和string属性的10000个对象插入到我的devmashine上的本地mysql数据库中需要执行以下操作:
StatelessSession: 4,6 seconds
Session: 5,7 seconds发布于 2012-06-12 14:51:08
我发现如果你做了很多插入,一级缓存会阻塞,很快就会让它慢下来,变成爬行。你可以尝试使用无状态会话,或者只是定期打开和关闭会话,即每5次插入一次。你当然会因为关闭会话而丢失一些东西,比如事务。
但最终,如果要插入的行数超过100行,我倾向于使用SqlBulkCopy,速度会快很多倍。
https://stackoverflow.com/questions/10942962
复制相似问题