Будьте в спящем режиме Отношения, Отображающие/Ускоряющий пакет, вставляют

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

  1. Это было бы быстрее, если бы у меня были они в 'родительском' классе, который содержал объекты и сделал a session.save(master) вместо каждого?
  2. Если бы у меня были они в ведущем устройстве/контейнерном классе, как я отобразился бы, это в в спящем режиме для отражения отношений? Контейнерный класс на самом деле не был бы таблицей самой по себе, но отношения все на основе двух индексов run_id (интервал) и строка (интервал).
  3. Другое направление было бы: Как делают я добираюсь, в спящем режиме, чтобы сделать многострочную вставку?
7
задан ashurexm 22 April 2010 в 20:16
поделиться

2 ответа

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

hibernate.order_inserts = true
hibernate.order_updates = true
  • Я перешел с использования Session на {{1 }} StatelessSession

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

  • Удален из каждого класса . Теперь Java создает его и назначает его объекту

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

  • Наконец, я включил dynamic-insert для моих классов в их определениях спящего режима, например:

7
ответ дан 6 December 2019 в 08:42
поделиться

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

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

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

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

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

hibernate.order_inserts = true
hibernate.order_updates = true

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

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

hibernate.jdbc.batch_size = xx

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

14
ответ дан 6 December 2019 в 08:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: