Гибернация пакетной вставки. Будет ли когда-нибудь использоваться одна вставка вместо нескольких вставок?

#java #oracle #hibernate #batch-file

#java #Oracle #гибернация #пакетный файл

Вопрос:

Я осматривался, пытаясь определить какое-либо поведение в режиме гибернации, в котором я не уверен. В сценарии, где пакетное управление в режиме гибернации настроено должным образом, будет ли когда-либо использоваться несколько инструкций insert только при отправке пакета? Разве невозможно использовать независимую от базы данных инструкцию multi-insert?

Я предполагаю, что я пытаюсь определить, действительно ли у меня правильно настроена пакетная обработка. Я вижу несколько инструкций insert, но затем я также вижу строку «Размер выполняемого пакета: 25».

Я мог бы опубликовать много кода, но я стараюсь придерживаться этого общего. Итак, мои вопросы:

1) Что вы можете прочитать в журналах, чтобы быть уверенным, что используется пакетная обработка?

2) Возможно ли заставить Hibernate использовать многорядную вставку вместо нескольких инструкций insert?

Комментарии:

1. Я бы на самом деле посетил базу данных, чтобы посмотреть, что происходит под капотом. У SQLServer есть профилировщик, который может рассказать вам почти все. С Oracle вам скорее нужно будет посетить объект v $ sql. Ссылка

2. Я сделал это, и, насколько я мог судить, он использует только инструкции insert. Я где-то читал, что журналы гибернации вводили в заблуждение, но я думаю, это было потому, что в этом конкретном примере использовался MySQL, у которого есть опция rewriteBatchedStatements, которая выполнит всю работу (я использую Oracle).

Ответ №1:

Hibernate использует несколько инструкций insert (по одной на объект для вставки), но отправляет их в базу данных в пакетном режиме (используя Statement.addBatch() и Statement.executeBatch() ). Именно по этой причине вы видите несколько инструкций insert в журнале, а также «Размер выполняемого пакета: 25».

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

Я почти уверен, что невозможно заставить Hibernate использовать многострочные вставки, но я также почти уверен, что это было бы бесполезно.

Комментарии:

1. Круто, это меня успокаивает. Я думал, что это работает именно так, но я не понимал, что пакетные инструкции, вероятно, так же хороши, как и вставка одного оператора. Спасибо.

Ответ №2:

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

После некоторого тестирования я нашел этот ответ, что пакет из нескольких вставок так же хорош, как и вставка из нескольких строк. Я провел тест, вставив 1000 строк один раз с использованием hibernate batch и один раз без. Оба теста заняли около 20 секунд, поэтому при использовании hibernate batch прироста производительности не было.

Чтобы убедиться, я попытался использовать опцию rewriteBatchedStatements из MySQL Connector / J, которая фактически объединяет несколько вставок в один оператор. Это сократило время вставки 1000 записей до 3 секунд.

Итак, в конце концов, hibernate batch кажется бесполезным, а настоящая многорядная вставка намного лучше. Я делаю что-то неправильно или что вызывает мои результаты тестирования?

Ответ №3:

Oracle bulk insert собирает массив объектов и передает в одном блоке в базу данных, связывая с ним уникальную вставку / обновление / удаление.

Это уникальный способ ускорить пропускную способность сети.

Oracle предлагает сделать это, вызвав хранимую процедуру из hibernate, передав ей массив данных.

Ответ №4:

http://biemond.blogspot.it/2012/03/oracle-bulk-insert-or-select-from-java.html?m=1 Это проблема не только программного обеспечения, но и инфраструктуры! Проблема заключается в оптимизации сетевого потока данных и фрагментации стека TCP. У Mysql есть функция. Вы должны сделать что-то вроде того, что описано в этой статье. Обычная передача по сети правильного объема данных — это решение

Вы также должны проверить, что mtu сети и использование Oracle sdu / tdu учитывают данные, передаваемые между приложением и базой данных