プロセスにパフォーマンス上の問題があります。これは、CMT Bean (jboss サーバー上) で起動される非同期タスクです。
1回の反復で、Hibernateを介してデータベースに1回の更新と3回の挿入が実行されます。プロセスは、100 回の反復ごとに新しいトランザクションに分割されます。
フラッシュは、更新/挿入のたびに EntityManager で呼び出されます。
最初のバッチの開始パフォーマンスは満足のいくものですが (約 5 ~ 8 秒)、時間の経過とともに大幅に遅くなります。30 番目のバッチが完了するまでに約 30 秒かかり、その後はバッチごとに 2 分以上になります。
FlushModeType を COMMIT に切り替え、entityManagers を手動でクリア/クローズし、entityManagers キャッシュをクリアしてみました。メモリ リークを探しましたが、このスローダウンの理由が見つかりません。
コードの実行時間を少し測定したところ、データベース接続に関連するすべてのコードが時間の経過とともに遅くなりました。より多くのエンティティが処理されるとトランザクションが遅くなることは理解していますが、新しいトランザクションも遅くなるのはなぜですか?
最新のプロセスは 250,000 回の反復 (1 つのスレッドで 2500 トランザクション) で構成され、終了までに永遠にかかります。
必要に応じて、さらに情報を提供します。どんな助けでも大歓迎です。
このコードを単純化して、休止状態の挿入を 1 つ実行し、他の操作を行わないようにしましたが、時間の経過とともに遅くなります。これは、内部で何が起こっているかの抽象的な疑似ビューです。
Bean1
@Asynchronous
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public void mainTask(){
while(...){
subTask();
}
}
Bean2
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public void subTask(){
100.times{
3*Insert
1*Update
}
}