Hibernate / MySQL Bulk вставка проблема - PullRequest
5 голосов
/ 20 февраля 2010

У меня проблемы с получением Hibernate для выполнения массовой вставки на MySQL.

Я использую Hibernate 3.3 и MySQL 5.1

На высоком уровне, вот что происходит:

@Transactional
public Set<Long> doUpdate(Project project, IRepository externalSource) {
    List<IEntity> entities = externalSource.loadEntites();
    buildEntities(entities, project);
    persistEntities(project);
}
public void persistEntities(Project project) {
     projectDAO.update(project);
}

В результате получается n записей журнала (по 1 на каждую строку):

Hibernate: вставить в ProjectEntity (имя, parent_id, путь, идентификатор_проекта, состояние, тип) значения (?,?,?,?,?,?)

Я бы хотел, чтобы это было в пакетном режиме, чтобы обновление было более производительным. Вполне возможно, что эта подпрограмма может привести к созданию десятков тысяч строк, и отключение БД на строку является убийцей.

Почему бы не получить этот пакет? (Насколько я понимаю, пакетные вставки должны быть по умолчанию в спящем режиме).

Ответы [ 3 ]

7 голосов
/ 25 февраля 2010

Паскаль ответил правильно. Однако, поскольку вы используете MySQL, я также настоятельно рекомендую вам использовать параметр rewriteBatchedStatements=true в вашем URL JDBC.

Этот параметр заставляет драйвер JDBC динамически перезаписывать ваши пакеты INSERT, чтобы использовать один «многозначный» INSERT, например ::100100

INSERT INTO mytable (mycol) VALUES (0);
INSERT INTO mytable (mycol) VALUES (1);
INSERT INTO mytable (mycol) VALUES (2);

будет переписано на:

INSERT INTO mytable (mycol) VALUES (0), VALUES (1), VALUES (2);

Это может иметь существенное значение в некоторых случаях. См. http://www.jroller.com/mmatthews/entry/speeding_up_batch_inserts_for для некоторых примеров измерений.

5 голосов
/ 20 февраля 2010

Как указано в главе 13. Пакетная обработка :

Если вы берете партию обработка вам нужно будет включить использование JDBC дозирования. Это абсолютно необходимо, если вы хотите достичь оптимальной производительности. Установить Размер партии JDBC до разумного числа (10-50, например):

hibernate.jdbc.batch_size 20

Hibernate отключает пакетную вставку при уровень JDBC прозрачно, если вы используйте генератор идентификаторов.

Не забудьте регулярно flush, а затем clear сеанс, иначе вы получите OutOfMemoryException, как описано в 13.1. Пакетные вкладыши .

Но IMO, для десятков тысяч строк, вы должны рассмотреть возможность использования StatelessSession интерфейса .

0 голосов
/ 21 февраля 2010

Паскаль в значительной степени прибил его в спящем контексте. В качестве альтернативы вы можете использовать Batchsqlupdate шаблона jbdc. Однако я должен предупредить вас, что кэшированные экземпляры hibernate могут не отражать изменения, сделанные с помощью выше. В нашем проекте мы должны были принять меры предосторожности, чтобы преодолеть это путем создания другого графика (еще одна проблема создана, но под нашим контролем)

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