1

バッチで子 (エンティティのコレクション (おそらく 1000000 以上)) を持つオブジェクトの作成または変更を処理する際に、いくつかの問題に直面しています。

最初に、オブジェクトを直接作成しようとしました:

entite.getEntiteManager(session).createEntite(entite);

ただし、例外:

maximum open cursors exceeded was thrown.

そこで、2 番目の方法を試しました。250 のリストで子を作成するよりも、最初に父を作成し、コミットするよりも父の参照に影響を与えます。そして、それは今の仕事です。

問題は、子の作成中に問題が発生した場合、問題に直面したリストのみをロールバックすることです。他のものはすでにコミットされています。

この場合、Spring Batch は私にとって役に立ちますか。彼はこの問題を扱っていますか。

4

1 に答える 1

0

Spring Batch の「チャンキング」の概念は、説明したように、再試行と失敗のシナリオをサポートします。つまり、500 件のレコードを作成して障害が発生したため、再起動したときに既に取得しているものを失いたくない場合です。

このようなジョブの簡単な構成は次のようになります。

<batch:job id="entityCreationJob">
    <batch:step id="entityCreationJob.step1">
        <batch:tasklet>
            <batch:chunk reader="entityReader" writer="entityWriter" commit-interval="250"/>
        </batch:tasklet>
    </batch:step>
</batch:job>

この単純な構成では、次のことが行われます。- 「行ごとに」単一のレコードを読み取り/作成する(entity.getEntityManager(session).createEntity(e)) - 250 レコード ブロックでレコードを「コミット」する (コミット間隔によって設定)

250 のコミット間隔で障害が発生した場合 (たとえば、レコード 1190 で)、190 レコードの作業が「失われる」だけです。前の 1000 は既にデータベースにコミットされています。アプリケーションが再起動すると、1001 レコードで取得して続行し、250 レコード ブロックでコミットします。

コミット/再試行コンポーネントを最大限に活用するにはJpaItemWriterJpaTransactionManagerまたは JTA トランザクション マネージャーを使用することをお勧めします。

于 2013-07-02T10:21:31.527 に答える