Пакетная вставка NHibernate не работает - PullRequest
2 голосов
/ 03 июня 2011

Я пытаюсь заставить пакетную вставку NH работать, чтобы перенести некоторые старые данные в нашу новую БД.Для тестового примера я настроил размер пакета следующим образом:

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

и в сеансе без сохранения состояния я вставляю около 1000 объектов перед совершением транзакции.Стратегия идентификатора объекта называется guid.comb и отображается следующим образом:

<id name="Id" access="field.camelcase-underscore" type="guid" column="id">
  <generator class="guid.comb"/>
</id>

Используя NH Profiler, я вижу, что все объекты вставляются как отдельные операторы и не объединяются, все они выглядят примерно так:

INSERT INTO Buddies
       (id)

ЗНАЧЕНИЯ ('81c7d3be-d718-45a4-86fe-9ef700b7ad55' / * @ p0_0 * /)

В чем может быть причина, что я должен сделать, чтобы получить дозирование для работы

Ответы [ 3 ]

1 голос
/ 05 июня 2011

Пакетная вставка работает только с сеансом, но не с StatelessSession.

Вставки без сохранения состояния выполняются немедленно.

1 голос
/ 13 июня 2017

Пакетирование операций DML работает с сеансом без сохранения состояния, но оно имеет те же ограничения, что и пакетирование с сеансом с полным состоянием, и некоторые дополнительные:

  • Он не может вставлять пакетные объекты, если эти объекты имеютвставлять полученные идентификаторы, например, генератор identity.
  • Он не может пакетно вставлять, обновлять или удалять объекты, охватывающие многие таблицы.
  • Может не работать с оптимистической блокировкой.(Здесь могут быть разные случаи, в зависимости от того, как генерируется версия.)
  • Кроме того, поскольку он не имеет состояния, он не будет пытаться перегруппировать операции одного класса сущностей, чтобы объединить их вместе.Как только вы начнете другую операцию (например, перейдете от вставки к обновлению) или начнете работать с сущностями другого типа, предыдущий пакет будет сброшен.Таким образом, при работе с сеансом без сохранения состояния пакетирование действительно не будет работать, если операции постоянно смешиваются.Разработчик должен перегруппировать их.

Как видно из вашего комментария к другому ответу, ваша сущность охватывает множество таблиц.Он не может быть пакетным.

Вот упрощенное и неполное объяснение того, как это работает.Дозатор DML работает с помощью команды вставки, обновления или удаления с параметрами для своих значений.Он хранит его вместе со значениями его параметров.При следующей полученной команде он проверяет, совпадает ли она с предыдущей.Если да, он сохраняет значения своих параметров.Если это другая команда, она сбрасывает предыдущий пакет и сохраняет новую команду.

Именно поэтому объект, охватывающий несколько таблиц, не может быть объединен: каждая операция над ним подразумевает множество команд, в результате чего дозатор сбрасывается в каждомоперация.В некоторых крайних случаях, когда вы вставляете базовую неабстрактную сущность, не охватывающую много таблиц, а затем дочернюю сущность, охватывающую много таблиц, вы можете наблюдать вставку базовой таблицы из первой дочерней сущности, которая будет объединена со вставкой базовой сущности.Но это угловой случай, который на самом деле не стоит пытаться использовать, поскольку он работает только для первой многосерийной сущности, следующей за базовой операцией, а не для следующих операций.

1 голос
/ 03 июня 2011

Попробуйте посмотреть здесь:

NHibernate 2.1.0.4000, похоже, не нравится пакетная вставка

Я думаю, что это тоже полезно:

http://fabiomaulo.blogspot.com/2009/02/nh210-generators-behavior-explained.html

в этой статье, в последнем примере он использует:

<id type="int">
   <generator class="identity"/>
</id>

, который, кажется, является ключом ... вы пробовали?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...