有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在嵌入式数据库中为Spring批处理创建元数据表

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

我尝试使用spring.batch.initialize-schema=embedded属性并将H2添加到类路径中,用H2数据源覆盖DefaultBatchConfigurerbean,替换JobRepositoryJobLauncherbean,但它不断在主Oracle数据库中创建元数据表。我使用的是SpringBatch 3.0.8和SpringBoot 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

共 (2) 个答案

  1. # 1 楼答案

    您需要验证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;
        }
    

    我希望这能有所帮助

  2. # 2 楼答案

    一,。重新定义基本batchconfigurer

    二,。在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);
        }
    }