web-dev-qa-db-ja.com

Hibernateでバッチ挿入を有効にするにはどうすればよいですか?

Hibernateで、バッチ挿入を有効にしようとすると

  <property name="jdbc.batch_size">50</property>

次の出力が得られます。

 [...] cfg.SettingsFactory INFO  - JDBC batch updates for versioned data: disabled
 [...] cfg.SettingsFactory INFO  - Order SQL inserts for batching: disabled

そしてこれ:

 [...] jdbc.AbstractBatcher DEBUG - Executing batch size: 1

基本的にbatch size: 1を超えることはありません。

設定が足りませんか?

13
rogerdpack

この場合に欠けていたのは次のとおりです。

<property name="order_inserts">true</property>

参照: https://forum.hibernate.org/viewtopic.php?p=237441https://stackoverflow.com/a/5240930/3245 またはおそらく休止状態.order_inserts。

わかりました

 [...] cfg.SettingsFactory INFO  - Order SQL inserts for batching: enabled
 ...
 [...] Executing batch size: 2

はるかに頻繁に(1より大きいものは、基本的にバッチ挿入が正常に実行されていることを意味します)。

hibernate.jdbc.batch_versioned_dataも役立つ場合があります。

jdbc:mysql:// localhost:3306/batch?rewriteBatchedStatements = trueタイプの接続文字列も何らかの形で関連している可能性があります。

https://forum.hibernate.org/viewtopic.php?p=237441 および Hibernateバッチサイズの混乱 も参照してください。

5
rogerdpack

INSERTステートメントとUPDATEステートメントの両方のバッチ処理を有効にする にするには、次のすべてのHibernateプロパティを設定する必要があります。

<property name="hibernate.jdbc.batch_size">30</property>
<property name="hibernate.order_inserts">true</property>
<property name="hibernate.order_updates">true</property>
<property name="hibernate.jdbc.batch_versioned_data">true</property>

SEQUENCEを使用できる場合は、IDENTITYジェネレーターを使用しないでください。 バッチフェッチが無効になります

SEQUENCE(MySQLなど)を使用できない場合は、 スケーリングせず、パフォーマンスが低下するTABLEジェネレーター を使用する代わりに、別のメカニズムを使用してバッチ挿入(jOOQなど)を有効にしてみてください。

13
Vlad Mihalcea