2017-03-20 57 views
0

私は春のバッチ用にJava設定(spring-boot)を使用しています。私は従業員IDのリストを持っており、IDごとに(以下のように)クエリを実行してからデータを処理する必要があります。JdbcCursorItemReaderを使用した動的SQLクエリ

select * from history where employee_id = ? 

私たちは、動的上記SQLでパラメータを設定するreader.setPreparedStatementSetterを使用することができます理解しています。しかし、リスト内の従業員IDごとにバッチ処理をどのように繰り返すことができるかわかりません。 reader()を@StepScopeとしてマークしても、リーダーは一度だけ呼び出されます。 (すなわち)、バッチは1回だけ実行されます。どんな助けもありがとうございます。

List employeeIds = new ArrayList(); 
    employeeIds.add(1); 
    employeeIds.add(2); 

    @Bean 
    @StepScope 
    public ItemReader<History> reader() { 
     JdbcCursorItemReader<History> databaseReader = new JdbcCursorItemReader<>(); 
     databaseReader.setSql("select * from history where employee_id = ?"); 
     databaseReader.setPreparedStatementSetter(..); 
     .... 

     return databaseReader; 
    } 


    @Bean 
    public Step step(StepBuilder stepBuilder){ 
     return stepBuilderFactory.get("sample"). 
       .reader(reader()) 
       .processor(processor()) 
       .writer(writer()) 
       .build(); 
    } 
+0

これは一般的なパターンです(http://docs.spring.io/spring-batch/reference/html/patterns.html#drivingQueryBasedItemReaders)。あなたのリーダーはIDリストからIDを返し、あなたの現在のリーダーはプロセッサーに変換する必要があります –

+0

うーん、1つのItemReaderを複数のItemProcessorsにマップできますか?なぜなら、元のリストのすべてのIDに対してItemProcessorを実行したいからです。 –

+0

はい、複合アイテムプロセッサ(http://docs.spring.io/spring-batch/apidocs/org/springframework/batch/item/support/CompositeItemProcessor.html) –

答えて

2

まず最初に、私はこれをおすすめしません。理論的には、ほとんどの場合、実際には、単一のカーソルを開くことは、毎回別々に照会するよりも効率的です。

"より良い"方法は、IDリストをステージング/ドライブテーブルに挿入することです(元のソースからそのIDリストを取得するたびに、以前の手順で行うのが一般的です)。次にクエリを次のように変更します:として、ここで注意してください(

select * from history where employee_id in (?) 

とそれにIDのリストを渡す:

select * from history where employee_id in (select id from driving_table) 

また、あなたは、最低限で、少なくともにあなたのクエリを変更することができます一部のデータベースではクエリのパラメータ数が制限されています)。あなたのリストがその限界を超えて脅かすならば、あなたは新しいカーソルを開いて、効果的にリストのページを変更する必要があります。

+0

ありがとうございます。このリストには約200000件のレコードが含まれているため、「IN」は機能しません。代わりにJOINを使うことができました。 –

+0

絶対に参加してください。もう一度クエリを実行するだけでデータを取り戻すよりもはるかに優れたパフォーマンスを発揮し、不要なI/Oを削減できます。 –