1

DBに挿入するレコードは約100,000件あります。Hibernate Batch インサートでこれを行うのは良い考えでしょうか? バッチサイズを選択するためのポリシーは何ですか?

それとも、一括挿入のためにストアド プロシージャを呼び出す必要がありますか? オブジェクトの配列を Hibernate から DB ストアド プロシージャに渡すことに関する情報を取得できませんでした。

または、両方を組み合わせて使用​​すると、プロセスが高速化されます。Stored Proc をバッチで呼び出すのが好きですか?

4

1 に答える 1

2

効率的なバッチ挿入のために、次のプロパティを有効にしてください。

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

また、エンティティ @Id column に IDENTITY を使用しないようにしてください。IDENTITY ジェネレーターがバッチ処理を無効にしました。

シーケンスをサポートする DB (Oracle、PostgreSQL、SQL Server 2008) を使用する場合は、強化されたジェネレーター、特にpooled-lo オプティマイザーを試すことをお勧めします。

Hibernate からストアド プロシージャを呼び出すこともできますが、バッチ挿入よりもデータの選択に便利です。

提案された Hibernate バッチ サポートが十分でない場合は、おそらくネイティブ ストアド プロシージャを試す必要があります。

どの方法を選択しても、実行時間の長いトランザクションに注意する必要があります。実行時間の長いトランザクションはロックを保持し、元に戻す/やり直しデータベースのログが大きくなり、トランザクションがさらに遅くなる可能性があります。

于 2014-11-06T14:45:04.620 に答える