我需要在Spring Batch阅读器中按顺序执行11个SQL SELECT查询。这些SELECT SQL在相当大的表上执行INNER JOIN
,并通过WHERE
子句中的单个列名相互区分。
所有这些读者的输出对象类型都是相同的,比方说VO
。
那么我该如何实现呢?
我可以在读者中传递where String
的where子句,这将在查询提供者中进一步设置。
@Bean
public ItemReader<VO> reader(String whereClause, @Value("#{stepExecutionContext[partitionNumber]}") String partitionNumber){
}
我不确定如何构建Spring Batch步骤,它按顺序在阅读器中设置这11个SQL并按顺序执行它们。由于所有阅读器的输出类型相同,因此会有单处理器和单个写入器。
所有这些读者的来源都是相同的数据库表,并且由于分页功能,我想使用JdbcPagingItemReader
。
我当前的读者是分区步骤的一部分,其中String partitionNumber
是分区标准。
我的意思是,如果输出类型很常见,我可以链接读者吗?如果这些读者按顺序被踢,我没有问题,但是我可以为单个处理器和编写者定义一个由读者链组成的步骤吗?
请建议解决方案或更好的策略。
答案 0 :(得分:1)
这是一种方法
以下是代码段
<job id="exampleJob" xmlns="http://www.springframework.org/schema/batch">
<step id="stepId">
<partition step="partitionerStepId" partitioner="examplePartitioner">
<handler grid-size="1" task-executor="syncTaskExecutor" />
</partition>
</step>
</job>
<step id="partitionerStepId" xmlns="http://www.springframework.org/schema/batch">
<tasklet>
<chunk reader="exampleReader" writer="exampleWriter" processor="exampleProcessor" commit-interval="1"/>
</tasklet>
</step>
public class ExamplePartitioner实现了Partitioner {
@Override
public Map<String, ExecutionContext> partition(int gridSize) {
Map<String, ExecutionContext> queue = new HashMap<String, ExecutionContext>();
for (int i=0; i<NUMBER_QUERIES; i++) {
ExecutionContext ec = new ExecutionContext();
**ec.put("sql", [your query]);**
queue.put("item"+i, ec);
}
return queue;
}
}
注意:对于您的情况,NUMBER_QUERIES为11。 注意:您可以将查询内容存储在安全的位置,也可以将其作为常量保存在类中。我不太确定查询是否有参数,因为你还没有提到过。
总而言之,Partitioner将构建一个列表查询并将它们放入ExecutionContext并通过&#34;#{stepExecutionContext [&#39; sql&#39;]}将它们按顺序传递给Reader。
谢谢, Nghia酒店
注意:我在格式化Reader时遇到问题,这就是我将其作为图像放置的原因。 注意:有关详细信息,请参阅here
中的链接