【问题标题】:Spring Batch - How to reads 5 million records in faster ways?Spring Batch - 如何以更快的方式读取 500 万条记录?
【发布时间】: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


    【解决方案1】:

    分区(方法 3)是 IMO 的最佳选择。如果您的主键是字符串,您可以尝试创建一个复合键(也就是组成唯一键的列组合)。

    【讨论】:

    • 在这种情况下什么是分区? (供我研究)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-10
    • 2021-11-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多