具有多个数据源和内存数据库的Spring Boot

时间:2016-04-30 21:17:37

标签: spring jpa spring-boot spring-jdbc

我正在尝试设置Spring Boot以使用多个数据源。我已经按照instructions设置了两个数据源并将其中一个设置为主数据。

@Configuration
@EnableJpaRepositories(basePackages={"my.postgres.repositories"}
                       entityManagerFactoryRef="postgresEntitymanager"
                       transactionManagerRef="postgresTransactionManager")
public class PgConfig {
@Primary
@Bean(name="postgresDS")
@ConfigurationProperties(prefix="spring.datasource.postgres")
public DataSource postgresDataSource() {
    return DataSourceBuilder.create().build();
}
@Primary
@Bean(name="postgresEntityManager")
public LocalContainerEntityManagerFactoryBean postgresEntityManager(EntityManagerFactoryBuilder builder) {
    return builder.dataSource(postgresDataSource())
            .packages("my.postgres.domain")
            .persistenceUnit("postgresPersistenceUnit")
            .build();
}

@Primary
@Bean(name = "postgresTransactionManager")
public PlatformTransactionManager postgresTransactionManager(
        @Qualifier("postgresEntityManager") EntityManagerFactory entityManagerFactory) {
    return new JpaTransactionManager(entityManagerFactory);
}

我有一个oracle的第二个配置类,缺少@Primary注释,但非常相似。我还将此添加到我的主类中以排除数据源自动配置。

@SpringBootApplication(exclude={DataSourceAutoConfiguration.class})

我遇到的问题是这个设置不允许我的针对H2数据库运行的集成测试打开连接......

Caused by: javax.persistence.PersistenceException: org.hibernate.exception.JDBCConnectionException: Could not open connection

Caused by: javax.persistence.PersistenceException: org.hibernate.exception.JDBCConnectionException: Could not open connection
Caused by: org.hibernate.exception.JDBCConnectionException: Could not open connection
Caused by: java.sql.SQLException: The url cannot be null

我在src / integrationtest / resources下使用单独的application.properties文件,其中包含

spring.jpa.database=H2

如何让我的集成测试使用H2作为我在运行测试时使用的存储库?

如果我不包含我的自定义数据源,一切似乎都能正常工作。

由于

1 个答案:

答案 0 :(得分:0)

您可以使用h2数据库添加自己的测试配置,但在生产中使用其他数据库。您已在Spring应用程序类中排除DataSourceAutoConfiguration,但它在集成测试中很有用。

一个简单的解决方案是仅为您的集成测试使用不同的spring应用程序类,而不排除DataSourceAutoConfiguration或仅实现您自己的DataSourceAutoConfiguration并启用它。您可以决定在自己的实施中何时启用或启用自己的DataSourceAutoConfiguration。例如,如果junit中存在spring-testclasspath,则会启用它,否则将被禁用。这要求junitspring-test不会包含在生产中,这可以由依赖管理(如maven)处理。