2013-04-08 179 views
2

我想讓我的Spring批量應用程序一次從數據庫中讀取50條記錄,然後將這50條記錄發送給處理器,然後發送給作者。Spring批量讀取多條記錄並處理多條記錄

有人可以告訴我如何做到這一點。

我試過使用JdbcPagingItemReader並將pageSize設置爲50,它讀取50條記錄,但rowMapper,處理器和寫入器一次只接收一條記錄,而不是獲取50條記錄。

我該怎麼做才能使處理器和寫入器在dto中獲得50條記錄,而不是一次接收一條記錄?

XML Spring配置

<job id="indexJob" job-repository="jobRepository"> 
    <step id="job1"> 
     <tasklet transaction-manager="transactionManager"> 
      <chunk reader="reader" processor="processor" writer="writer" commit-interval="1"/> 
     </tasklet> 
    </step> 
</job> 

的Java Spring配置

@Bean 
@Scope("step") 
public JdbcPagingItemReader reader() throws Exception { 

    MySqlPagingQueryProvider provider = new MySqlPagingQueryProvider(); 
    provider.setSelectClause("select id"); 
    provider.setFromClause("from BATCH_CUSTOMER"); 
    provider.setSortKey("id"); 

    JdbcPagingItemReader reader = new JdbcPagingItemReader(); 
    reader.setDataSource(this.dataSource()); 
    reader.setQueryProvider(provider); 
    reader.setPageSize(50); 
    reader.setRowMapper(new MyRowMapper()); 
    reader.afterPropertiesSet(); 

    int counter = 0; 
    ExecutionContext executionContext = new ExecutionContext(); 
    reader.open(executionContext); 
    Object pageCredit = new Object(); 
    while (pageCredit != null) { 
     pageCredit = reader.read(); 
     System.out.println("pageCredit:" + pageCredit); 
     counter++; 
    } 
    reader.close(); 

    return reader; 
} 

回答

4

在你的xml配置,更改提交間隔爲50

+0

這沒有奏效。 MyRowMapper,處理器和編寫器一次只能獲得一條記錄。 – hajime 2013-04-08 15:51:22

+0

http://forum.springsource.org/showthread.php?136209-JdbcPagingItemReader-not-passing-all-page-records-to-the-processor&p=442538#post442538 – hajime 2013-04-09 12:29:53

0

回答Spring Batch的論壇

http://forum.springsource.org/showthread.php?136209-JdbcPagingItemReader-not-passing-all-page-records-to-the-processor&p=442538#post442538

這是所有設計想要處理的每條記錄。 ItemWriter可以根據需要獲取儘可能多的記錄,但受到提交間隔的限制。你的是1,這意味着每個記錄都是單獨提交的,我建議你將它設置爲50.處理器通過它自己處理每條記錄,直到達到提交間隔,然後調用writer。正如你所提到的,你是1.