2013-04-08 129 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.