无法使用NHibernate进行批量插入

时间:2011-01-18 16:08:09

标签: nhibernate bulkinsert stateless-session

我尝试在我的应用程序中添加批量插入,但Batcher仍然是NonBatchingBatcher,BatchSize为1。

这是使用C#3,NH3RC1和MySql 5.1

我已将此添加到我的SessionFactory

<property name="adonet.batch_size">100</property>

我的代码非常像这样

var session = SessionManager.GetStatelessSession(type);
var tx = session.BeginTransaction();
session.Insert(instance);

我正在为有问题的实例使用HILO标识生成,但不是对数据库中的所有实例都使用HILO标识生成。 SessionFactory.OpenStatelessSession不接受类型,所以它不能真正知道它可以在这种类型上进行批处理,或者......?

在深入了解NHibernate后,我在SettingsFactory.CreateBatcherFactory中发现了一些可能提供更多信息的内容

// It defaults to the NonBatchingBatcher
System.Type tBatcher = typeof (NonBatchingBatcherFactory);

// Environment.BatchStrategy == "adonet.factory_class", but I haven't
// defined this in my config file
string batcherClass = PropertiesHelper.GetString(Environment.BatchStrategy, properties, null);
if (string.IsNullOrEmpty(batcherClass))
{
    if (batchSize > 0)
    {
        // MySqlDriver doesn't implement IEmbeddedBatcherFactoryProvider,
        // so it still uses NonBatchingFactory
        IEmbeddedBatcherFactoryProvider ebfp = connectionProvider.Driver as IEmbeddedBatcherFactoryProvider;

我的配置可能有误吗?

  <hibernate-configuration  xmlns="urn:nhibernate-configuration-2.2" >
    <session-factory name="my application name">
      <property name="adonet.batch_size">100</property>
      <property name="connection.driver_class">NHibernate.Driver.MySqlDataDriver</property>
      <property name="connection.connection_string">my connection string
      </property>
      <property name="dialect">NHibernate.Dialect.MySQL5Dialect</property>
      <property name="proxyfactory.factory_class">NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle</property>
      <!-- To avoid "The column 'Reserved Word' does not belong to the table : ReservedWords" -->
      <property name="hbm2ddl.keywords">none</property>
    </session-factory>
  </hibernate-configuration>

3 个答案:

答案 0 :(得分:3)

我知道这个问题已有一年了,但有a NuGet package为NHibernate增加了MySQL批处理功能。它没有直接融入NHibernate的原因是该功能需要引用MySQL.Data程序集,而开发团队并不想要依赖。

答案 1 :(得分:2)

IIRC,目前仅支持Oracle和SqlServer的批处理。

与NH的几乎任何其他方面一样,这是可扩展的,因此您可以编写自己的IBatcher / IBatcherFactory并通过配置注入它们。

旁注:当前版本的NH是3.0 GA。

答案 2 :(得分:0)

真的很老问题但是......让我们完全正确

批处理不工作的另一个原因可能是使用无状态会话(如您的情况)。无状态会话不支持批处理。来自documentation

  

由insert定义的insert(),update()和delete()操作   StatelessSession接口被认为是直接数据库   行级操作,导致立即执行SQL   分别是INSERT,UPDATE或DELETE。因此,他们有很大的不同   Save(),SaveOrUpdate()和Delete()操作的语义   由ISession接口定义。