我需要在Spring Batch阅读器中按顺序执行11个SQL SELECT查询 . 这些SELECT SQL在相当大的表上执行 INNER JOIN
,并在 WHERE
子句中通过单个列名相互区分 .
所有这些读者的输出对象类型都是相同的,比方说 VO
.
那么我该如何实现呢?
我可以在读者中传递where子句 String
,它将在查询提供程序中进一步设置 .
@Bean
public ItemReader<VO> reader(String whereClause, @Value("#{stepExecutionContext[partitionNumber]}") String partitionNumber){
}
我不确定如何构建Spring Batch步骤,它按顺序在阅读器中设置这11个SQL并按顺序执行它们 . 由于所有阅读器的输出类型相同,因此会有单处理器和单个写入器 .
所有这些读者的来源都是相同的数据库表,我想使用 JdbcPagingItemReader
由于分页功能 .
我当前的读者是分区步骤的一部分,其中 String partitionNumber
是分区标准 .
我的意思是,如果他们的输出类型很常见,我可以链接读者吗?如果这些读者按顺序被踢,我没有问题,但是我可以为单个处理器和编写器定义一个由读者链组成的步骤吗?
请建议解决方案或更好的策略 .
1 回答
这是一种方法
以下是代码段
公共类ExamplePartitioner实现Partitioner {
}
注意:对于您的情况,NUMBER_QUERIES为11 . 注意:您可以将查询内容存储在安全的位置,也可以将其作为常量保存在类中 . 我不太确定查询是否有参数,因为你还没有提到 .
注意:请构建'exampleRowMapper'以映射到VO对象 .
总而言之,分区程序将构建一个列表查询并将它们放入ExecutionContext并通过“#{stepExecutionContext ['sql']}将它们按顺序传递给Reader .
谢谢,Nghia
注意:我在格式化Reader时遇到问题,这就是我将其作为图像放置的原因 . 注意:有关详细信息,请参阅here中的链接