0

プロセスにパフォーマンス上の問題があります。これは、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
        }
}
4

3 に答える 3

0

これは Java の問題であることが判明しました。さまざまな構成でアプリケーションをテストしたところ、jboss が Java 1.7 (1.6 ではなく) で実行されている場合は問題なく動作します。すべてのバッチは約 5 秒で終了します。現在、Java を 1.7 にアップグレードするか、Java 1.6 のセットアップの問題点をさらに掘り下げて見つけるかの選択に反対しています。

于 2013-07-22T11:51:45.477 に答える
0

JPA を使用したバッチ プログラムの実行中に、同様の問題が数回発生しました。私たちが見つけた唯一の解決策は、多くの処理を伴うバッチ プログラムに jdbc api を使用することです。

于 2013-07-19T13:08:33.733 に答える