当前位置: 首页 > 知识库问答 >
问题:

Spring批量读取多个记录并处理多个记录

岳研
2023-03-14

我希望我的Spring批处理应用程序一次从数据库中读取50条记录,然后将这50条记录发送给处理器,然后发送给写入器。

有人可以告诉我如何做到这一点吗?

我尝试使用JdbcPagingItemReader并将pageSize设置为50,这样可以读取50条记录,但是rowMapper、处理器和编写器一次接收一条记录,而不是获得50条记录。

如何使处理器和写入器在dto中获得50条记录,而不是一次接收一条记录?

xml spring config

<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>

JavaSpring配置

@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;
}

共有2个答案

范翰海
2023-03-14

在Spring批量论坛中回答

http://forum.springsource.org/showthread.php?136209-JdbcPagingItemReader-不将所有页面记录传递给处理器

这是您想要处理每条记录的设计。ItemWriter 获取所需数量的记录,但受提交间隔的约束。你的是1,这意味着每个记录都是单独提交的,我建议你把它设置为50。处理器自行处理每条记录,直到达到提交间隔,然后调用编写器。如前所述,您的是1。

邹山
2023-03-14

在您的xml配置中,将提交间隔更改为50。

 类似资料:
  • 我使用的是spring批处理,和通常使用的一样,我有读取器、处理器和写入器。 我有两个问题 1>Reader查询所有200条记录(表中记录总大小为200,我给出了pageSize=200),因此它得到所有200条记录,在处理器中,我们需要所有这些记录的列表,因为我们必须将每个记录与其他199条记录进行比较,以便将它们分组在不同的层中。因此我在想,如果我们能在处理步骤中得到那个列表,我就可以操纵它们

  • 我的计划是 使用多线程步骤,以便每个线程读取一条记录-在处理器中生成多条记录-将生成的记录写入单独的excel文件。 使用同步读取器从进程表中读取。 在处理器中,使用读取器中返回的记录查询DB(涉及多个联接)并形成一个复合对象。 用自定义编写器将复合对象写入文件 就内存管理而言,上面的方法听起来不太好。 因为要写入的记录是在处理器中生成的(而不是从读取器那里获得的,读取器只是给出记录ID),所以只

  • 我在Aerospike数据库中有一个名称空间:test and set:user。我通过控制台上的以下命令在users中添加了四条记录: 通过aql命令,我可以查看这四条记录。aql 我知道一个接一个地获取记录的方法,它在我这边运行得很好,但这对于我的任务来说是非常昂贵的操作。我想读取多个记录(批读取)并对其执行多个算法。我从https://www.aerospike.com/docs/clien

  • 我需要从多个目录中读取文件,并处理数据并将其存储到DB中。目前我正在使用块多资源阅读器,它适用于1个目录。但现在我必须从多个目录中读取文件。如何使用Spring批处理来做到这一点

  • CompositeItemWriter:当我需要将项目平均地分给Writer时,似乎会将所有读取的项目传递给所有的Writer。 BacktoBackPatternClassifier:我并不真正需要分类器,因为我是均匀地拆分项目。 有没有另一种方式,让一个读者和多个作者? 或者我可以在Writer中手动创建线程?

  • Im使用存储库项目读取器从数据库读取事务,使用flatfileitem写入器处理和写入文件。我使用容错跳过任何记录,如果它是错误的。为了检查一条记录是否有错误,我们在处理器中进行一些验证并抛出自定义异常。 批处理配置 事务读取器bean 而writer只是一个flatfile编写器。问题是,在读取了很少事务之后,在我的例子中,在读取并处理了9个无效事务之后,批处理作业被卡住了。不知道为什么。 困在