web-dev-qa-db-ja.com

休止状態のバッチ処理/ order_inserts / order_updatesがデフォルトで無効になっているのはなぜですか?

hibernateバッチ処理/hibernate.order_updates/hibernate.order_insertsがデフォルトで無効になっている理由はありますか? 50のバッチサイズを有効にした場合、不利な点はありますか? order_updates/order_insertsパラメーターについても同じです。この機能を有効にすべきではないユースケースはありますか?この機能を使用すると、パフォーマンスに影響はありますか?

これらの設定は、クエリ数を減らす必要がある場合にのみ役立つことがわかります。これは、特にアプリケーションとデータベースサーバー間の待ち時間が長いクラウド環境で必要です。

15
fbe

通常、_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_プロパティに関する一言。エンティティABがあり、次のように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);  // ...
_

上記の実行後:

  • これらの6つのオブジェクトには識別子が生成されています
  • これらの6つのオブジェクトはセッションに接続されています(StatefulPersistenceContext:entitiesByKey、entityEntriesなど。/Hib.v3/)
  • これらの6つのオブジェクトは、同じ順序でActionQueueに追加されます:[A1、B1、A2、B2、A3、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を使用していると思います。

29
przemek hertel

ここのドキュメント: https://docs.jboss.org/hibernate/stable/orm/userguide/html_single/chapters/batch/Batching.html

これらのプロパティを使用すると、パフォーマンスが低下する可能性があると述べています。これがデフォルトで設定されていない理由だと思います。

1
Jason White