使用弹簧数据进行弹簧启动批量以不同模式(在内存中:HSQL或H2)写入元数据

问题描述:

我正在使用以下网络编写批处理: Spring Boot运行应用程序:V1.5.3.RELEASE Spring批处理Spring Batch的配置:弹簧一批基础设施V3.0.7.RELEASE 春数据为我的泛型DAO的业务数据库:>弹簧数据的JPA V1.11.3.RELEASE 我的数据源到Oracle datbase是HikariDataSource:使用弹簧数据进行弹簧启动批量以不同模式(在内存中:HSQL或H2)写入元数据

@Qualifier("dataSource") 
@Bean(destroyMethod = "close") 
@Primary 
public HikariDataSource dataSource() throws SQLException { 
    return buildDataSource(); 
} 

    public HikariDataSource buildDataSource() throws SQLException { 
    HikariDataSource ds = new HikariDataSource(); 
    ds.setMaximumPoolSize(poolSize); 
    ds.setDriverClassName(driverClassName); 
    ds.setJdbcUrl(jdbcUrl); 
    ds.setUsername(userName); 
    ds.setPassword(password); 
    ds.setConnectionTestQuery("SELECT 1 from DUAL"); 

    ds.addDataSourceProperty("hibernate.show_sql", showSQL); 
    ds.addDataSourceProperty("hibernate.use_sql_comments", useSQLComment); 
    ds.addDataSourceProperty("hibernate.format_sql", formatSQL); 
    ds.addDataSourceProperty("hibernate.ddl-auto", "none"); 



    return ds; 
} 

我想写我的元数据在另一个数据库(例如在内存中的HSQL或H2),但我找不到方法,因为上下文写入m eta数据在同一个数据库中。 的唯一方法是定义一个事务管理器和一个EntityManager,并让他们在我的DAO:

@Bean 
PlatformTransactionManager businessTransactionManager() throws SQLException { 
    return new JpaTransactionManager(businessEntityManagerFactory().getObject()); 
} 

@Bean 
LocalContainerEntityManagerFactoryBean businessEntityManagerFactory() throws SQLException { 

    HibernateJpaVendorAdapter jpaVendorAdapter = new HibernateJpaVendorAdapter(); 
    jpaVendorAdapter.setGenerateDdl(true); 

    LocalContainerEntityManagerFactoryBean factoryBean = new LocalContainerEntityManagerFactoryBean(); 

    factoryBean.setDataSource(dataSource()); 
    factoryBean.setJpaVendorAdapter(jpaVendorAdapter); 
    factoryBean.setPackagesToScan("package.of.business.model", "package.of.business.data"); 

    return factoryBean; 
} 

,并在我的批量配置我补充一下:

@EnableJpaRepositories(entityManagerFactoryRef = "businessEntityManagerFactory", 
    transactionManagerRef = "businessTransactionManager", basePackages = {"package.of.business.model", 
    "package.of.business.data"}) 

这样,它的工作原理后,我定义的春天在我app.properties默认数据源:

spring.datasource.url=jdbc:h2:mem:test 
spring.datasource.driverClassName=org.h2.Driver 
spring.datasource.username=sa 
spring.datasource.password= 
spring.jpa.hibernate.ddl-auto=update 

我真正想要做的是这样做的正好相反,我想,默认数据库是布西ness one,我想覆盖写入元数据的数据源,但我找不到方法。我甚至尝试做一些针对性的BatchConfigurer:

CustomBatchConfigurer extends DefaultBatchConfigurer 

它仅适用于我的元数据后,我禁用我的默认数据源春数据的初始化,但它并不在我的Oracle业务数据库写什么:

batch.data.source.init=false 
spring.batch.initializer.enabled=false 
spring.batch.initialize.enabled=false 
spring.datasource.initialize=false 
spring.datasource.continue-on-error=true 

有没有人有任何想法如何做到这一点?

你需要一般是通过扩展DefaultbatchConfigurer创建BatchConfigurer(的自定义实现,将允许您配置批处理DataSource明确

在这里你可以在文档中阅读更多关于BatchConfigurer:。http://docs.spring.io/spring-batch/apidocs/org/springframework/batch/core/configuration/annotation/BatchConfigurer.html