Hibernate Relationship Mapping / Ускорение пакетных вставок - PullRequest
7 голосов
/ 23 апреля 2010

У меня есть 5 таблиц MySQL InnoDB: Test,InputInvoice,InputLine,OutputInvoice,OutputLine, и каждая из них сопоставлена ​​и работает в Hibernate.Я играл с использованием StatelessSession / Session и размера пакета JDBC.Я удалил все классы генератора, чтобы MySQL мог обрабатывать генерацию идентификатора, но он все еще работает довольно медленно.Каждая из этих таблиц представлена ​​в Java-классе и соответственно отображается в спящем режиме.В настоящее время, когда приходит время записывать данные, я перебираю объекты и делаю session.save(Object) или session.insert(Object), если использую StatelessSession.Я также делаю сброс и очистку (при использовании Session), когда количество строк достигает максимального размера пакета jdbc (50).

  1. Было бы быстрее, если бы я имел их в родительском классе,держал объекты и делал session.save(master) вместо каждого?
  2. Если бы я имел их в классе мастер / контейнер, как бы я отобразил это в hibernate, чтобы отразить отношения?Контейнерный класс на самом деле не был бы собственной таблицей, но все отношения основаны на двух индексах run_id (int) и line (int).
  3. Другое направление будет таким: Как мне заставить Hibernate сделатьмногорядная вставка?

Ответы [ 2 ]

14 голосов
/ 23 апреля 2010

Стратегия генерации идентификатора имеет решающее значение для пакетной вставки в Hibernate. В частности, генерация IDENTITY обычно не работает (обратите внимание, что AUTO обычно также сопоставляется с IDENTITY). Это связано с тем, что во время пакетной вставки Hibernate имеет флаг под названием «requireImmediateIdAccess», который указывает, нужны ли сгенерированные идентификаторы немедленно или нет; если это так, пакетная обработка отключена.

Вы можете легко заметить это в журналах уровня DEBUG, когда в нем говорится «немедленно выполнить вставку идентификатора» - это означает, что он пропустил пакетную обработку, поскольку ему было сказано, что сгенерированные идентификаторы необходимы сразу после вставки.

Стратегии генерации, которые обычно делают работают, ТАБЛИЦА И ПОСЛЕДОВАТЕЛЬНОСТЬ, потому что Hibernate может предварительно генерировать идентификаторы, тем самым обеспечивая возможность пакетной вставки.

Быстрый способ определить, работает ли ваша пакетная вставка, - это активировать журналы уровня DEBUG, поскольку BatchingBatcher явно сообщит вам размер пакета, который он выполняет («Выполнение размера пакета:» + batchSize).

Кроме того, следующие свойства важны для достижения пакетной вставки. Я не осмеливаюсь говорить, что они требуются, поскольку мне не хватает специалиста по Hibernate, чтобы сделать это - возможно, это просто моя конкретная конфигурация - но, по моему опыту, они были необходимы, тем не менее:

hibernate.order_inserts = true
hibernate.order_updates = true

Эти свойства довольно плохо документированы, но я считаю, что они позволили правильно сгруппировать операторы SQL INSERT и UPDATE для пакетного выполнения; Я думаю, что это могут быть многорядные вставки, которые вы ищете. Не стреляйте в меня, если я ошибаюсь, я вспоминаю по памяти.

Я также продолжу и предположу, что вы установили следующее свойство; если нет, то это должно служить напоминанием:

hibernate.jdbc.batch_size = xx

Где хх - желаемый размер партии, естественно.

7 голосов
/ 23 апреля 2010

Окончательное решение для меня было использовать ответ voetsjoeba в качестве отправной точки. Моя конфигурация гибернации использует следующие параметры:

hibernate.order_inserts = true
hibernate.order_updates = true
  • Я изменил с Session на StatelessSession

  • Повторно заказал Java-код для обработки всех элементов в партии стол за один раз. Итак все таблицы x, затем таблицы y и т. д.

  • Удалены <generator> с каждого учебный класс. Java теперь создает это и присваивает его объекту

  • Создана логика, которая позволила мне определить, просто ли Идентификатор был установлен, а не писать «пустые» строки в базе данных

  • Наконец-то я включил dynamic-insert для моих занятий в спящем определения вроде так: <class name="com.my.class" table="MY_TABLE" dynamic-insert="true">

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