2013-06-17 9 views
13

私は、(DBから)アイテムのリストを読み込み、アイテムを処理する必要があり、一旦処理されると、DBに更新する必要がある。Springバッチステップ、タスクレットまたはチャンク間の決定

私はSpringバッチチャンクをリーダー、プロセッサ、ライターで使用することを考えています。私の読者は一度に1つのアイテムをリストから戻してプロセッサに送り、処理が終わるとWriterに戻り、DBを更新します

これらのメソッドでは、後でマルチスレッディングすることがあります。

ここで私はいくつかの懸念を予期しています。

  1. 処理するアイテムの数はこれより多くなる可能性があります。 10,000以上の場合もあります。
  2. プロセッサでは論理計算が必要です。したがって、一度に1つのアイテムを処理する。 10スレッドでマルチスレッド化されていても、パフォーマンスは不明です。
  3. ライターは、その処理済みアイテムのDB内の結果を更新できます。バッチ更新を行う方法がわからないのは、常に1つのアイテムしか処理されていないためです。

このアプローチはこの種の用途に適していますか、それとももっと良いことができますか? リーダー、プロセッサ&ライターの1回の呼び出しでアイテムの束を処理する他の方法はありますか?もしそうなら、私はリストから10個のアイテムを抽出してプロセッサに渡すという、いくつかのメカニズムを作成する必要がありますか? ライターが各レコードを更新するようですが、バッチ更新は作者が処理されたアイテムの束を受け取った場合にのみ意味があります。なにか提案を?

パフォーマンスを向上させるために、このデザインにいくつかのライトを投げてください。

ありがとう、

答えて

13

スプリングバッチは、必要な処理を行うのに最適なツールです。

チャンク指向のステップでは、コミット間隔プロパティを使用して読み込み/処理/書き込みするアイテムの数を設定できます。

 <batch:step id="step1" next="step2"> 
     <batch:tasklet transaction-manager="transactionManager" start-limit="100"> 
      <batch:chunk reader="myReader" processor="myProcessor" writer="MyWriter" commit-interval="800" /> 
      <batch:listeners> 
       <batch:listener ref="myListener" /> 
      </batch:listeners> 
     </batch:tasklet> 
    </batch:step> 

あなたの読者が10 000レコードを返すSELECTステートメントを呼び出すとします。コミット間隔= 500を設定します。

MyReaderはread()メソッドを500回呼び出します。実際には、読者の実装では実際にresultSetから項目を削除する可能性があります。 read()を呼び出すたびに、MyProcessorのprocess()メソッドも呼び出されます。

しかし、コミット間隔に達するまで、MyWriterのwrite()メソッドは呼び出されません。

あなたは、インタフェースItemWriterの定義を見てみると:あなたは書き込みが項目のリストを受け取ることがわかり

public interface ItemWriter<T> { 

/** 
* Process the supplied data element. Will not be called with any null items 
* in normal operation. 
* 
* @throws Exception if there are errors. The framework will catch the 
* exception and convert or rethrow it as appropriate. 
*/ 
void write(List<? extends T> items) throws Exception; 

} 

。このリストはあなたのコミット間隔のサイズになります(または終了に達した場合はそれ以下)

そして、レコードの10000は何もありません。数百万のレコードに対処する必要がある場合は、マルチスレッドを検討することができます。しかし、それでもコミット間隔値のスイートスポットで遊んでいるだけで十分でしょう。

希望します。

+0

ありがとうございます。本当に役に立ちました。 – Vimal

+0

私の喜び。あなたは – Cygnusx1

+0

でガイドしてくださいhttp://stackoverflow.com/questions/36391219/bean-property-is-not-readable-or-has-an-invalid-getter-method-does-the-return-t/36391306 ?noredirect = 1#comment60399566_36391306? –