Spring Batch动态查询JdbcPagingItemReader并在步骤之间传递数据

时间:2018-12-26 10:46:31

标签: spring-boot spring-batch

我有一个使用Spring Boot和Spring Batch的要求,我需要从一个数据库中读取数据,该数据库返回如下记录

Id1  Select * from Table1
Id2  Select * from Table2

每个查询将在不同的数据库中执行,并将返回超过10万条记录 以下是我遇到的疑问

  1. 将查询传递给阅读器(即从一个步骤转移到另一步骤)

  2. 动态读取查询并使用JdbcPagingItemReader获取记录,因为每个查询将返回> 100k条记录并使用项目编写器进行写入。

所有查询将返回相同的项目/ pojo。

2 个答案:

答案 0 :(得分:0)

  

第一个查询返回的列值又是一个sql查询,需要在另一个数据库中执行并通过分页读取并将它们插入第一个数据库中

在这种情况下,您可以分两步进行:

  • 步骤1(tasklet):执行第一个查询并将其结果(由读者执行的查询)放在执行上下文中
  • 第2步(面向块):从执行上下文中读取查询并将查询动态传递给读取器

答案 1 :(得分:0)

必须使用Placeholder(?)

创建查询

* EX Query-SELECT * FROM PRODUCT WHERE status =? AND name =?*

创建ItemStreamReader:-

SingleInstance

为PreparedStatementSetter接口创建一个Implementer类

@Bean
public ItemStreamReader<Product> reader() {
    JdbcCursorItemReader<Product> reader = new JdbcCursorItemReader<>();
    reader.setDataSource(DataSource);
    reader.setSql(SELECT_QUERY);
    reader.setPreparedStatementSetter(new InputSetter());
    reader.setRowMapper(new BeanPropertyRowMapper<>(Product.class));
    return reader;
}

}