spring - Spring Batch - 如何以更快的方式读取 500 万条记录?
问题描述
我正在开发 Spring Boot v2.2.5.RELEASE 和 Spring Batch 示例。在此示例中,我使用来自一个数据中心的系统读取 500 万条记录JdbcPagingItemReader
并将Postgres
其写入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 writer,我使用 Spring Data Mongo 作为自定义 writer:
工作详情
@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 阅读?
方法3:分区,如何在我PK为UUID的地方使用它?
解决方案
分区(方法 3)是 IMO 的最佳选择。如果您的主键是字符串,您可以尝试创建一个复合键(也就是组成唯一键的列组合)。
推荐阅读
- c - 当文件名在 C 中作为命令行参数传递时,它们是如何存储的?
- docker - docker-compose up OSError 参数无效
- java - Eclipse/RapidClipse X 10.2.2 Java 元素更改通知侦听器发生异常
- reactjs - 上传放大托管时是否有特殊的方式来调用视频?
- javascript - 使用像哈巴狗这样的模板引擎的用户事件?
- vim - 如何反复水平滚动?
- python - 超参数调整 k-means 聚类
- swift - swift中的明暗模式
- machine-learning - 二元和分类交叉熵的不同结果
- opengl - 如何在片段着色器中实现折射光?