#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 учитывают данные, передаваемые между приложением и базой данных