当前位置: 首页 > 知识库问答 >
问题:

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

孙项禹
2023-03-14

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

@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的第二个配置类,它缺少@主注释,但非常相似。我还将其添加到我的主类中以排除数据源自动配置。

@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下的属性文件,其中包含

spring.jpa.database=H2

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

如果我不包括我的自定义数据源,一切似乎都很好。

谢谢

共有1个答案

张淳
2023-03-14

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

一个简单的解决方案是,仅在集成测试中使用不同的spring应用程序类,而不排除DataSourceAutoConfiguration,或者只实现自己的DataSourceAutoConfiguration并启用它。您可以决定何时在自己的实现中启用或不启用自己的数据源自动配置。例如,如果您的类路径中存在junit或spring测试,它将被启用,否则将被禁用。这要求junit或spring测试不包含在生产中,可以由依赖关系管理(如maven)来处理。

 类似资料:
  • 我的场景是,批处理作业应该从1db(H2)读取数据,并将数据转储到另一DB(postgres)中。因此,我配置了多个数据源 我已经使用spring batch 4.2和spring boot 2.2.5编写了批处理作业。释放现在我需要为端到端测试编写测试用例。 我使用ResourcelessTransactionManager使用自定义批处理配置器来避免在内存和实际数据库中保存批处理表元数据,并且

  • 问题内容: 我试图弄清楚如何使用docker-compose.yml和2个从sql dump导入的数据库来实现docker。 以上返回以下内容: 基本上,我试图在单个docker compose文件中获取整个堆栈设置,创建2个数据库并导入相应的sql转储。有人有什么建议吗? 问题答案: 就像其他可能对此有所了解的人的更新一样。 我通过删除解决了这个问题: 从 docker-compose.yml中

  • 问题内容: 我今天一直在研究这堆东西,我开始认为我想做的事不可能实现,因此,我向你寻求帮助,强大的Stackoverflow。 我建立一个RESTful服务平台在Java中使用Spring 3.1.2数据JPA +作为我的持久层。我的数据模型对象都实现为扩展Spring JpaRepository接口的接口。如示例所示,我已经将所有内容连接在一起并可以很好地使用单个数据源(请注意,显示的数据源是D

  • 我今天一直在研究这个问题,我开始认为我想做的事情可能是不可能的,所以我向你寻求帮助,伟大的斯达克弗洛。 我正在用Java构建一个RESTful服务平台,用Spring Data 3.1.2 JPA作为我的持久层(如本文所述)。我的数据模型对象都是作为扩展Spring JpaRepository接口的接口实现的。我已经用一个数据源很好地连接和运行了所有的东西,如这个例子所示(注意这里显示的数据源是D

  • 目前正在进行一个项目,我的Spring Boot项目需要在同一个DB服务器中利用多个数据源或模式。我发现了几个在spring boot中教授多数据源配置的教程,其中实体foo存在于数据源A中,bar存在于数据源B中,即下面的内容。, https://scattercode.co.uk/2016/01/05/multiple-databases-with-spring-boot-和spring数据j

  • 一、内存数据库: 在SQLite中,数据库通常是存储在磁盘文件中的。然而在有些情况下,我们可以让数据库始终驻留在内存中。最常用的一种方式是在调用sqlite3_open()的时候,数据库文件名参数传递":memory:",如: rc = sqlite3_open(":memory:", &db); 在调用完以上函数后,不会有任何磁盘文件被生成,取而代之的是,一个新的数据库在纯内存中被成功创建了。