hibernateバッチ処理/hibernate.order_updates/hibernate.order_insertsがデフォルトで無効になっている理由はありますか? 50のバッチサイズを有効にした場合、不利な点はありますか? order_updates/order_insertsパラメーターについても同じです。この機能を有効にすべきではないユースケースはありますか?この機能を使用すると、パフォーマンスに影響はありますか?
これらの設定は、クエリ数を減らす必要がある場合にのみ役立つことがわかります。これは、特にアプリケーションとデータベースサーバー間の待ち時間が長いクラウド環境で必要です。
通常、_batch size
_を適切なサイズに設定し、_order_insert
_、_order_updates
_をtrue
に設定すると、パフォーマンスを大幅に向上させることができます。
私のすべてのプロジェクトでは、この構成を基礎として使用しています。
_hibernate.jdbc.batch_size = 100
hibernate.order_inserts = true
hibernate.order_updates = true
hibernate.jdbc.fetch_size = 400
_
ただし、yes-バッチ処理を使用すると、メモリへの影響が発生する可能性があります。ただし、これはjdbcドライバーによって異なります。
たとえば、Oracle JDBCドライバーは、PreparedStatement
ごとに内部バッファーを作成し、これらのバッファーを再利用します。単純な更新ステートメントを呼び出す場合は、ps.setInt(1, ...)
、ps.setString(2, ...)
などでいくつかのパラメーターを設定すると、Oracleはこの値をいくつかのバイト表現に変換し、このPreparedStatement
に関連付けられたバッファーに格納します。と接続。
ただし、PreparedStatement
がサイズ100のバッチを使用する場合、このバッファーは100倍大きくなります。また、たとえば50の接続用の接続プールがある場合、50のそのような大きなバッファが存在する可能性があります。また、バッチ処理を使用する100の異なるステートメントがある場合、そのようなすべてのバッファーはメモリに大きな影響を与える可能性があります。バッチサイズを有効にすると、グローバル設定になります-Hibernateはすべての挿入/更新にそれを使用します。
ただし、すべてのプロジェクトで、このメモリへの影響よりもパフォーマンスの向上が重要であることがわかりました。そのため、デフォルトとして_batchsize=100
_を使用しています。
_order_inserts
_、_order_updates
_では、これらの設定はバッチ処理がオンの場合にのみ意味があるため、デフォルトでは無効になっていると思います。バッチ処理をオフにすると、これらの順序付けは単純にオーバーヘッドになります。
詳細については、Oracleのホワイトペーパーを参照してください。
http://www.Oracle.com/technetwork/topics/memory.pdf
セクション「ステートメントのバッチ処理とメモリ使用」。
====編集2016.05.31 ====
_order_inserts
_および_order_udpates
_プロパティに関する一言。エンティティA
、B
があり、次のように6つのオブジェクトを永続化するとします。
_session.save(A1); // added to action queue
session.save(B1); // added to action queue
session.save(A2); // ...
session.save(B2); // ...
session.save(A3); // ...
session.save(B3); // ...
_
上記の実行後:
ここで、2つのケースを考えてみましょう。
ケース1:_order_inserts = false
_
フラッシュフェーズ中に、hibernateは6 insertステートメントを実行します。
_ActionQueue = [A1, B1, A2, B2, A3, B3]
insert into A - (A1)
insert into B - (B1)
insert into A - (A2)
insert into B - (B2)
insert into A - (A3)
insert into B - (B3)
_
ケース2:_order_inserts = true
_、バッチ処理を許可
現在、フラッシュフェーズ中に、休止状態は2バッチ挿入ステートメントを実行します。
_ActionQueue = [A1, A2, A3, B1, B2, B3]
insert into A - (A1, A2, A3)
insert into B - (B1, B2, B3)
_
これをHibernatev3について調査しましたが、Hibernatev4も同じようにActionQueueを使用していると思います。
ここのドキュメント: https://docs.jboss.org/hibernate/stable/orm/userguide/html_single/chapters/batch/Batching.html
これらのプロパティを使用すると、パフォーマンスが低下する可能性があると述べています。これがデフォルトで設定されていない理由だと思います。