【问题标题】:Create metadata tables for Spring Batch in an embedded database在嵌入式数据库中为 Spring Batch 创建元数据表
【发布时间】:2018-09-18 13:23:35
【问题描述】:

我正在使用带有 @EnableBatchProcessing 的 Spring Boot 自动配置 Spring Batch 设置。问题是它在主数据库中创建元数据表,我不希望这种行为。我想将所有 Spring Batch 信息保存到嵌入式数据库中。

我尝试使用spring.batch.initialize-schema=embedded 属性并将H2 添加到类路径中,用H2 数据源覆盖DefaultBatchConfigurer bean,替换JobRepositoryJobLauncher bean,但它会不断在主Oracle 中创建元数据表数据库。我正在使用 Spring Batch 3.0.8 和 Spring Boot 1.5.9。

感谢您的帮助,谢谢!

更新:添加来配置:

H2 配置:

@Bean
public DataSource springBatchDataSource() {
    DriverManagerDataSource dataSource = new DriverManagerDataSource();
    dataSource.setDriverClassName("org.h2.Driver");
    dataSource.setUrl("jdbc:h2:mem:db;DB_CLOSE_DELAY=-1");
    dataSource.setUsername("sa");
    dataSource.setPassword("sa");

    return dataSource;
}

甲骨文:

@Bean
@Primary
public DataSource dataSource() throws SQLException {
    PoolDataSourceImpl dataSource = new PoolDataSourceImpl();
    dataSource.setConnectionFactoryClassName(environment.getRequiredProperty("db.driverClassName"));
    dataSource.setURL(environment.getRequiredProperty("db.url"));
    dataSource.setUser(environment.getRequiredProperty("db.username"));
    dataSource.setPassword(environment.getRequiredProperty("db.password"));
    dataSource.setFastConnectionFailoverEnabled(Boolean.valueOf(environment
            .getRequiredProperty("db.fast.connect.failover.enabled")));
    dataSource.setValidateConnectionOnBorrow(true);
    dataSource.setSQLForValidateConnection("SELECT SYSDATE FROM DUAL");
    dataSource.setONSConfiguration(environment.getRequiredProperty("db.ons.config"));
    dataSource.setInitialPoolSize(Integer.valueOf(environment.getRequiredProperty("db.initial.pool.size")));
    dataSource.setMinPoolSize(Integer.valueOf(environment.getRequiredProperty("db.min.pool.size")));
    dataSource.setMaxPoolSize(Integer.valueOf(environment.getRequiredProperty("db.max.pool.size")));
    dataSource.setAbandonedConnectionTimeout(120);
    dataSource.setInactiveConnectionTimeout(360);
    dataSource.setTimeToLiveConnectionTimeout(0);

    return dataSource;
}

批量配置:

@Configuration
@EnableBatchProcessing
public class BatchConfigurer extends DefaultBatchConfigurer {

    @Override
    @Autowired
    public void setDataSource(@Qualifier("springBatchDataSource") DataSource dataSource) {
        super.setDataSource(dataSource);
    }

}

还有一些相关的属性..

spring:
  batch:
    job.enabled: false

【问题讨论】:

  • 你的意思是你覆盖了DefaultBatchConfigurer#setDataSource(...)? Oracle DataSource 是如何配置的? H2DataSource是怎么配置的?请发布 appliation.properties 和/或带注释的代码,显示 bean 是如何创建/命名的。
  • @Andrew S 嘿 Andrew,感谢您的建议,是的,我已尝试覆盖 setDataSource 并创建 DefaultBatchConfigurer 类型的 bean。请查看编辑
  • @Qualifier 是否适用于被覆盖的方法?也许尝试调试并设置断点来检查堆栈以查看为什么使用 dataSource 而不是 springBatchDataSource。一切都失败了,也许切换 bean 名称,所以 H2 是 dataSource.
  • @Andrew S 工作正常)似乎是初始化程序中的问题..

标签: java spring spring-boot spring-batch


【解决方案1】:

1.重新定义BasicBatchConfigurer

2.在spring-boot-batch-starter中,你必须创建自己的BatchDataSourceInitializer,它会执行init sql脚本

@Configuration
public class MyBatchConfigurer {

    @Bean
    public BasicBatchConfigurer batchConfigurer(BatchProperties properties,
                @Qualifier("springBatchDataSource") DataSource dataSource,
                ObjectProvider<TransactionManagerCustomizers> transactionManagerCustomizers) {
            return new BasicBatchConfigurer(properties, dataSource,
                    transactionManagerCustomizers.getIfAvailable());
        }

    @Bean
    public BatchDataSourceInitializer batchDataSourceInitializer(@Qualifier("springBatchDataSource") DataSource dataSource,
            ResourceLoader resourceLoader, BatchProperties properties) {
        return new BatchDataSourceInitializer(dataSource, resourceLoader,
                properties);
    }
}

【讨论】:

  • 有趣.. 但是,它继续在 oracle 数据库中创建表。我想,我应该重新定义 BatchAutoConfiguration 中定义的 BatchDatabaseInitializer bean。你怎么看?
  • 尝试从你的pom.xml中删除spring-boot-batch-starter,只需要添加spring-batch-core-xxx.jar
  • BatchDatabaseInitializer 由 spring-boot-batch-stater 创建
  • 有没有像 BatchDatabaseInitializer 一样在嵌入式数据库中创建元数据表的类?
  • 我修改了我的答案,尝试加入 spring-boot-batch-starter
【解决方案2】:

您需要限定您的 H2 数据源 bean

  @Bean(name = "springBatchDataSource")
    public DataSource springBatchDataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName("org.h2.Driver");
        dataSource.setUrl("jdbc:h2:mem:db;DB_CLOSE_DELAY=-1");
        dataSource.setUsername("sa");
        dataSource.setPassword("sa");

        return dataSource;
    }

希望对你有所帮助。

【讨论】:

  • 默认情况下,Java Config 中的 bean 以创建它的方法的名称命名
猜你喜欢
  • 2020-04-20
  • 2019-09-04
  • 2018-09-08
  • 2015-09-23
  • 2015-09-08
  • 2020-03-02
  • 2019-10-22
  • 2014-11-01
  • 1970-01-01
相关资源
最近更新 更多