У меня есть 5 таблиц MySQL InnoDB: Test,InputInvoice,InputLine,OutputInvoice,OutputLine
и каждый отображается, и функционирующий в В спящем режиме. Я играл с использованием StatelessSession/Session и размера пакета JDBC. Я удалил любые классы генератора, чтобы позволить MySQL обработать идентификационное поколение - но это все еще работает довольно медленный. Каждая из тех таблиц представлена в классе Java и отображена в, в спящем режиме соответственно. В настоящее время, когда это прибывает время для выписывания данных, я циклично выполняюсь через объекты и делаю a session.save(Object)
или session.insert(Object)
если я использую StatelessSession. Я также делаю сброс и ясный (при использовании Сессии), когда мое количество строки достигает макс. размера пакета jdbc (50).
session.save(master)
вместо каждого?Окончательным решением для меня было использование ответа voetsjoeba в качестве отправной точки. В моей конфигурации гибернации используются следующие параметры:
hibernate.order_inserts = true
hibernate.order_updates = true
Я перешел с использования Session
на {{1 }} StatelessSession
Повторно упорядочил код Java для обработки всех элементов в пакете по таблице за раз. Итак, все таблицы x, затем таблицы y и т. Д.
Удален
из каждого класса
. Теперь Java создает его и
назначает его объекту
Созданная логика, которая позволила мне определить, был ли установлен только идентификатор, и не записывать 'пустые' строки в база данных
Наконец, я включил dynamic-insert
для моих классов в их определениях
спящего режима, например:
Стратегия генерации идентификатора критически важна для пакетной вставки в 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 - желаемый размер партии, естественно.