Невозможно выполнить массовую вставку с помощью NHibernate

Я попытался добавить массовую вставку в свое приложение, но 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>

3 ответа

Решение

IIRC, пакетирование в настоящее время поддерживается только для Oracle и SqlServer.

Как почти любой другой аспект NH, это расширяемый, так что вы можете написать свой собственный IBatcher/IBatcherFactory и ввести их через конфигурацию.

Sidenote: текущая версия NH - 3.0 GA.

Я знаю, что этому вопросу уже год, но есть пакет NuGet, который добавляет функциональность пакетирования MySQL в NHibernate. Причина, по которой он не встроен непосредственно в NHibernate, заключается в том, что для функциональности требуется ссылка на сборку MySQL.Data, а команде разработчиков не нужна зависимость.

Действительно старый вопрос, но... давайте будем полностью правы

Еще одна причина, по которой пакетирование не работает, - использование сеанса без сохранения состояния (как в вашем случае). Сеанс без сохранения состояния не поддерживает пакетную обработку. Из документации:

Операции insert (), update () и delete (), определенные интерфейсом StatelessSession, считаются прямыми операциями на уровне строк базы данных, которые приводят к немедленному выполнению SQL INSERT, UPDATE или DELETE соответственно. Таким образом, они имеют очень разную семантику для операций Save(), SaveOrUpdate() и Delete(), определенных интерфейсом ISession.

Другие вопросы по тегам