【问题标题】:Spring Batch Dynamic Query JdbcPagingItemReader and Pass Data Between StepsSpring Batch 动态查询 JdbcPagingItemReader 并在步骤之间传递数据
【发布时间】:2019-05-24 15:39:00
【问题描述】:

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

Id1  Select * from Table1
Id2  Select * from Table2

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

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

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

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

【问题讨论】:

  • @MahmoudBenHassine 能否请您对此有所了解。
  • 当然!但是,我不清楚这个问题。您需要从两个不同的表中读取相同的数据并将它们写入另一个表中吗?对吗?
  • @MahmoudBenHassine 感谢您的回复。让我明确我的问题。第一个查询返回一个列值,它又是一个 sql 查询,需要在另一个数据库中执行并通过分页读取并将它们插入到第一个数据库中。如果您需要更多详细信息,请告诉我

标签: spring-boot spring-batch


【解决方案1】:

必须使用 Placeholder(?) 来创建查询

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

创建 ItemStreamReader :-

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

为 PreparedStatementSetter 接口创建一个 Implementer 类

public class InputSetter implements PreparedStatementSetter {
@Override
public void setValues(PreparedStatement ps) throws SQLException {
    ps.setString(1, "status");
    ps.setString(2,"Name");

}

}

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 谢谢。是否可以提供相同的伪代码。因为我不确定如何将第一步的结果存储到执行上下文中并在步骤 2 中将其传递给阅读器跨度>
    • 请查看此部分:docs.spring.io/spring-batch/4.1.x/reference/html/… 它提供了如何在步骤之间共享数据的代码示例。
    猜你喜欢
    • 1970-01-01
    • 2020-07-11
    • 2015-12-20
    • 1970-01-01
    • 1970-01-01
    • 2020-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多