【发布时间】:2012-04-14 04:44:00
【问题描述】:
我想在 Oracle 11g 上使用 NHibernate 3.2 加快批量 insert 操作。为此,我尝试了
Session.Save(entity);
Session.Flush();
Session.Clear();
...在我的foreach 循环中,但由于会话中缺少对象而导致异常:
未能延迟初始化角色集合:MyClass.PropertyX,没有会话或会话已关闭
另一种尝试是设置批量大小:
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
<session-factory>
<property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
<property name="connection.driver_class">NHibernate.Driver.OracleClientDriver</property>
<property name="connection.connection_string">xxx</property>
<property name="dialect">NHibernate.Dialect.Oracle10gDialect</property>
<property name="adonet.batch_size">50</property>
<property name="query.substitutions">true=1, false=0</property>
<property name="proxyfactory.factory_class">NHibernate.Bytecode.DefaultProxyFactoryFactory, NHibernate</property>
</session-factory>
</hibernate-configuration>
另外我在我的代码中设置了Session.SetBatchSize(50) 得到了以下异常:
没有为会话工厂定义批处理大小,批处理是 禁用。设置 adonet.batch_size = 1 以启用批处理。
引发此异常的唯一位置是NonBatchingBatcher,因此看来我的会话使用了错误的批处理器。
这里有什么问题?如何使用 NHibernate 加快批量插入(不使用无状态会话)?
【问题讨论】:
-
您的第一个例外究竟是什么?此外,如果您在 循环内 执行
Flush,您将不会批处理任何内容。 -
@Diego Mijelshon 添加了异常消息
-
@deamon 这是多线程的吗?
标签: .net performance oracle nhibernate orm