【问题标题】:Spring Batch Reader for distributed DB2 database用于分布式 DB2 数据库的 Spring Batch Reader
【发布时间】:2016-08-22 06:21:30
【问题描述】:

我正在尝试使用 Spring 批处理框架编写作业。作业需要从集群的 db2 数据库中获取数据,在每个获取的记录上调用一些逻辑,然后将转换后的数据存储在同一个数据库中(与读取位置不同的表)。我正在尝试如下写step1

@Bean
    public Step step1(StepBuilderFactory stepBuilderFactory,
            ItemReader<RemittanceVO> reader, ItemWriter<RemittanceClaimVO> writer,
            ItemProcessor<RemittanceVO, RemittanceClaimVO> processor) {

        return stepBuilderFactory.get("step1")
                .<RemittanceVO, RemittanceClaimVO> chunk(100).reader(reader)
                .processor(processor).writer(writer).build();
    }

目前,由于数据库是 DB2 和集群,我面临两个挑战,

1.

为元数据提供的 SQL 位于 - /org/springframework/batch/core/schema-db2.sql 不适用于 分布式 DB2。它在命令 constraint JOB_INST_UN unique (JOB_NAME, JOB_KEY) 上失败。

写在这个文件中的查询可以是 调整到分布式 db2 或者我也可以手动创建表,但我是 不确定我是否应该手动创建表?如果那会有一些 进一步的并发症?

我需要所有这些表,因为我想使用 Spring 批处理来实现其 PAUSERESTART 功能。

2.

我们需要在 DB2 上触发所有 SELECT 查询 与READ ONLY WITH URSO question。 如果我们不使用这个关键字运行查询,db 可能会被锁定。

第 2 点的问题是我不能在 Spring Batch(JdbcPagingItemReader 等)的内置阅读器类中使用,因为它们不支持这个 db2 特定关键字。

通过阅读互联网上解释该框架优势的无用简单示例,我认为我将在很短的时间内启动并运行,但看起来我必须编写自己的查询提供程序类,研究元数据 sql 等等如果 db 恰好是 DB2 并且是分布式的。

有没有人为分布式 Db2 数据库实现过类似的工作并指导我了解以上几点?

【问题讨论】:

    标签: spring-batch


    【解决方案1】:

    我想,为了解决第 1 点,我将手动创建表,因为我已在 another question 中确认表不会自动删除,因此不需要重新创建表。一次手动活动就足够了。

    我将通过在事务级别指定隔离级别来解决第 2 点,这样就不需要 SELECT 查询中的WITH UR

    @Autowired
        private DataSource dataSource;
        @Bean
            public TransactionTemplate transactionTemplateUR(){
                TransactionTemplate txnTemplate = new TransactionTemplate();
                txnTemplate.setIsolationLevelName("ISOLATION_READ_UNCOMMITTED");
                txnTemplate.setTransactionManager(txnManager);
                return txnTemplate;
            }
    
            @Bean
            public PlatformTransactionManager txnManager(DataSource dataSource){
                DataSourceTransactionManager txnManager = new DataSourceTransactionManager();
                txnManager.setDataSource(dataSource);
                return txnManager;
            }
    

    【讨论】:

    • 您对第 2 点的解决方案并不好,因为如果发生回滚,您将获得不一致的数据。因此,您应该使用 org.springframework.batch.item.database.support.Db2PagingQueryProvider 作为起点并根据您的要求进行修改。
    猜你喜欢
    • 2023-03-15
    • 2020-08-12
    • 2020-08-24
    • 2018-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-02
    • 2021-08-12
    相关资源
    最近更新 更多