用于分布式DB2数据库的Spring Batch Reader

我正在尝试使用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.

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

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

我需要所有这些表因为我想使用Spring批处理它的 PAUSERESTART 功能 .

2.

我们需要使用 READ ONLY WITH UR SO question在DB2上触发所有SELECT查询 . 如果我们不使用此关键字运行查询,则db可能会被锁定 .

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

通过在互联网上阅读无用的简单示例来解释这个框架的优点,我认为我将在很短的时间内启动并运行但看起来我必须编写自己的查询提供程序类,研究元数据sqls以及如果db发生则不会是DB2和分布式的 .

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

回答(1)

2 years ago

我想,为了解决第一点,我将手动创建表格,因为我已经在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;
        }