Невозможно выполнить массовую вставку с помощью NHibernate - PullRequest
3 голосов
/ 18 января 2011

Я попытался добавить массовую вставку в свое приложение, но Batcher все еще не является BatchingBatcher с размером пакета Batch 1.

Это использует C # 3, NH3RC1 и MySql 5.1

IЯ добавил это в мою 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 ]

3 голосов
/ 22 марта 2012

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

2 голосов
/ 18 января 2011

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

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

Sidenote: текущая версия NH составляет 3,0 GA.

0 голосов
/ 04 мая 2016

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

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

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

...