【发布时间】:2020-05-15 19:53:53
【问题描述】:
我正在开发 Spring Boot v2.2.5.RELEASE 和 Spring Batch 示例。在此示例中,我使用 JdbcPagingItemReader 从一个数据中心的 Postgres 系统读取 500 万条记录,并将 MongoDB 写入另一个数据中心。
此迁移太慢,需要使此批处理作业的性能更好。我不确定如何使用分区,因为我在那个表中有一个 PK 保存 UUID 值,所以我想不出使用ColumnRangePartitioner。有没有最好的方法来实现这一点?
方法一:
@Bean
public JdbcPagingItemReader<Customer> customerPagingItemReader(){
// reading database records using JDBC in a paging fashion
JdbcPagingItemReader<Customer> reader = new JdbcPagingItemReader<>();
reader.setDataSource(this.dataSource);
reader.setFetchSize(1000);
reader.setRowMapper(new CustomerRowMapper());
// Sort Keys
Map<String, Order> sortKeys = new HashMap<>();
sortKeys.put("cust_id", Order.ASCENDING);
// POSTGRES implementation of a PagingQueryProvider using database specific features.
PostgresPagingQueryProvider queryProvider = new PostgresPagingQueryProvider();
queryProvider.setSelectClause("*");
queryProvider.setFromClause("from customer");
queryProvider.setSortKeys(sortKeys);
reader.setQueryProvider(queryProvider);
return reader;
}
然后是 Mongo 编写器,我使用 Spring Data Mongo 作为自定义编写器:
工作详情
@Bean
public Job multithreadedJob() {
return this.jobBuilderFactory.get("multithreadedJob")
.start(step1())
.build();
}
@Bean
public Step step1() {
ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
taskExecutor.setCorePoolSize(4);
taskExecutor.setMaxPoolSize(4);
taskExecutor.afterPropertiesSet();
return this.stepBuilderFactory.get("step1")
.<Transaction, Transaction>chunk(100)
.reader(fileTransactionReader(null))
.writer(writer(null))
.taskExecutor(taskExecutor)
.build();
}
方法 2:AsyncItemProcessor 和 AsyncItemWriter 会是更好的选择,因为我仍然必须使用相同的 JdbcPagingItemReader 进行阅读?
Approach-3:Partition,在我 PK 为 UUID 的地方如何使用?
【问题讨论】:
标签: spring spring-batch