3

Spring バッチ アプリケーションで一度にデータベースから 50 レコードを読み取り、その 50 レコードをプロセッサに送信してからライターに送信する必要があります。

誰かがこれを行う方法を教えてください。

JdbcPagingItemReader を使用して、pageSize を 50 に設定して 50 レコードを読み取ろうとしましたが、rowMapper、プロセッサ、およびライターは、50 レコードを取得する代わりに、一度に 1 つのレコードを受け取ります。

プロセッサとライターが一度に 1 つのレコードを受け取るのではなく、dto で 50 レコードを取得するようにするにはどうすればよいですか?

xml スプリング構成

<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 スプリング構成

@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

2 に答える 2

4

XML 構成で、commit-interval を 50 に変更します。

于 2013-04-08T15:36:30.880 に答える
0

Spring バッチ フォーラムで回答済み

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

各レコードを処理したいのは、すべて設計によるものです。ItemWriter は必要な数のレコードを取得しますが、コミット間隔によって制限されます。あなたのものは 1 で、各レコードが個別にコミットされることを意味します。50 に設定することをお勧めします。プロセッサは、コミット間隔に達するまで各レコードを単独で処理し、ライターが呼び出されます。前述のとおり、あなたは 1 です。

于 2013-04-09T12:28:34.953 に答える