如何在Spring Batch中加速Writer内部的进程运行



我有一个弹簧批处理过程。Reader将从数据库中读取数据,Writer将发送POST请求并更新数据库。我使用的是Partitioner,而GridSize是100。问题在Writer内部,该过程需要一些时间。数据库中有5000万条记录。但由于Writer过程的缓慢,这需要几天的时间才能完成。如果我注释掉Writer进程并运行,那么它将在4小时内完成批处理进程。所以慢是因为Writer内部的过程。

public class DataWriter implements ItemWriter<Sample> {
private final JdbcTemplate jdbc;
@Autowired        
private RestTemplate rst;
public DataWriter(DataSource dataSource) {
this.jdbc = new JdbcTemplate(dataSource);
}
public void write(List<? extends Sample> samples) {
samples.forEach(this::run);
}
private void run(Sample sample) {
boolean value = sendRequest();
jdbc.update("UPDATE_QUERY", value, sample.getId());
}
private boolean sendRequest() {
ResponseEntity<String> res = rst.postForEntity("URL", getRequestData(), String.class);
return res.getStatusCode().value() == 200;
}
}

如何使其快速?我该怎么解决这个问题?提前谢谢。

不,速度慢不在编写器中,而是在数据库设置中。我想你插入的这个表有约束吗?如果是这样,您需要确保每个表约束都有一个完全匹配的索引。即,如果您有一个组合了三列的表约束,则需要一个组合所有三列的索引

还需要与您的DBA检查可能在该表上的事件上执行的任何其他细节逻辑/scripts/PLSQL/触发器。

或者,您可以在作业开始时创建一个临时表并插入其中。然后在作业结束时,运行一个表到表的复制(如果不存在(到所需的表。在数据库中进行表到表的复制要快得多。

最新更新