【问题标题】:Unable to bulk insert using NHibernate无法使用 NHibernate 批量插入
【发布时间】:2011-06-11 04:56:00
【问题描述】:

我尝试向我的应用程序添加批量插入,但 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 身份生成,但不是为数据库上的所有实例。 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>

【问题讨论】:

    标签: nhibernate bulkinsert stateless-session


    【解决方案1】:

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

    【讨论】:

    • 您是否使用 NH3.2+ 3.3 更新了此软件包?
    【解决方案2】:

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

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

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

    【讨论】:

    • 确定吗?我似乎记得以前使用 Ado.Net 在 MySql 上使用过批处理。我也找不到太多关于此的信息。猜猜我将不得不深入研究一些代码,看看我是否可以得到至少部分支持。我知道 GA 已经发货了。只是还没来得及升级它。
    • 源码中只有 IBatcher 的 3 个实现:OracleDateClient、SqlClient 和 NonBatching,所以我认为这是不可能的。您可能会将其与适用于所有数据库的 batch-size 属性混淆。
    • 但是如果没有 IBatcher,batch-size 就没什么好说的了,对吧?
    • 这完全不相关,但我见过人们混淆了他们。
    【解决方案3】:

    确实是老问题,但是......让我们完全正确

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

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

    【讨论】:

      猜你喜欢
      • 2012-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-04
      • 1970-01-01
      • 1970-01-01
      • 2019-05-10
      相关资源
      最近更新 更多