Невозможно выполнить массовую вставку с помощью 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.