1

ファイルを読み取り、ファイルを処理してDBに保存するバッチステップがあります。しかし、それは全負荷であるため、新しいレコードを挿入する前に DB からテーブルを削除する必要があります。

私の質問は、Spring バッチ (リーダー、プロセッサ、ライター) で既存のテーブルを削除するコードを記述するのに最適な場所はどこかということです。以下に複数のシナリオを示します。

  1. open()リーダー クラスのメソッドでこれItemReader<>を行います。

  2. フラグを作成し、一度設定し、そのフラグに基づいてプロセッサ クラスのテーブルを削除します。

  3. 別の一時テーブルを作成し、すべてのレコードをファイルからこのテーブルにコピーしてから、「@AfterStep」メソッドで、実際のテーブルからすべてのレコードを削除し、すべてのレコードを一時テーブルからこのテーブルに移動します。

の前に一度だけ呼び出されるメソッドはありますItemprocessorか?フラグを使用する以外の方法はありますか? 提案してください

4

2 に答える 2

0

ここには2つのステップがあるように思えます:

  1. 既存のテーブルを切り捨てます。
  2. ファイルからデータを挿入します。

最初に実行するステップを決定する必要があります。

「切り捨て」ステップを最初に実行する場合は、切り捨てを実行する前にファイルを検証するためのチェックを追加できます。たとえば、 aを使用@BeforeStepして、ファイルが存在すること、読み取り可能であること、およびサイズが 0 でないことを確認できます。

データベーステーブルをロードする前にファイル全体がエラーなしで解析されることを保証する必要がある場合は、言及したようにデータを一時的な場所に解析し、2番目のステップでデータを一時的な場所から最終的な場所に移動する必要がありますテーブル。そこにいくつかのオプションがあります:

  1. 提案どおりにデータを保持する一時テーブルを作成します。ファイルを読み取った後、別の手順でターゲット テーブルを切り捨て、一時テーブルからターゲット テーブルに移動します。
  2. 「createdDateTime」列または既存のテーブルに類似したものと「executionDate」ジョブ パラメータを追加します。次に、解析された新しい行を挿入します。2 番目のステップでは、作成時間が executionDate よりも短い行をすべて削除します (これは、テーブルの PK に対して生成された ID を使用していることを前提としています)。
  3. 既存のテーブルに「ステータス」列を追加します。新しい行を「保留中」として挿入します。次に、2 番目のステップで、「アクティブ」なすべての行を削除し、「保留中」の行を「アクティブ」に更新します。
  4. 解析されたデータをメモリ内に格納します。これはいくつかの理由で危険です。特にファイルが大きい場合。これにより、失敗するとメモリ内のデータが失われるため、失敗したジョブを再開する機能も削除されます。
于 2013-10-09T14:48:12.243 に答える