2017-03-03 9 views
0

私は春のバッチアプリケーションが動作しています。テキストファイルから読み込み、oracleテーブルに書き込むだけです。チャックのロードを実行します。現在、私は2000のチャックサイズを設定しています。問題は、このジョブのスキップリスナーを実装すると、与えられたチャンクサイズを無視して、一度に1つのレコードだけをデータベースに挿入していることです。 listernerをスキップするのは、無効なレコードをテキストファイルに書き込むことです。これは春のバッチがどのように機能するのですかスプリングバッチ、チャンクサイズ、およびスキップリスナーを一緒に

+0

"一度に1レコードだけをデータベースに挿入しています。"あなたはそれが毎回別々の取引で行われていると確信していますか?トランザクションの境界に必要なチャンク。 –

+0

私は春に提供されたJdbcBatchItemWriterを使用しています。私はトランザクション関連のコードを書いていません。 JPATransactionManagerをSpring Beanとして設定しました。 – Vasanthakumar86

答えて

0

チャンクでは、ItemWriterは常に最初にチャンク内のアイテムのリスト全体を書き込もうとします。ただし、スキップ可能な例外がスローされた場合、フレームワークはエラーの原因となったアイテムを特定する必要があります。

これを行うには、トランザクションがロールバックされ、項目が1つずつリトライされます。これにより、問題の原因となった可能性のあるアイテムがスキップリスナーに渡されます。残念ながら、チャンクのバッチ不能も取り除きます。

一般に、プロセッサで事前検証を実行することが推奨されているため、例外をスローしてアイテムを個別に再試行するのではなく、アイテムを「フィルタ処理」することができます。

+0

実際、スキップ可能な例外はSQLExceptionsです。たとえば、特定の列に挿入する値が最大長を超えている場合などです。 SQLExceptionを取得します。私はこの例外をスキップ可能にしています。このような種類の検証では、プロセッサではできません。 Writerクラスでのみ実行できます。私たちはバッチ不能を達成し、春に機能をスキップできますか? – Vasanthakumar86

+0

プロセッサ内のフィールド長は絶対に*確認できます。 1つのオプションは、各フィールドをチェックし、必要に応じて切り捨てます。また、注釈ベースの検証(たとえば、@Column(nullable = false、length = 12))を使用して、挿入できないことがわかっている項目を破棄(フィルタリング)することができます。 –

関連する問題