Spring + 内存中的多个H2实例

标签 spring spring-boot datasource h2

要在内存中创建两个不同的 H2 实例。为了确保发生这种情况,我使用相同的模式和不同的数据初始化了两个实例。这样,当我使用 DAO 查询时,会从不同的数据源中选取不同的数据集。然而这并没有发生。我究竟做错了什么?如何正确命名H2实例?

@Bean(name = "DS1")
@Primary
public EmbeddedDatabase dataSource1() {
    return new EmbeddedDatabaseBuilder().
            setType(EmbeddedDatabaseType.H2).
            setName("DB1").
            addScript("schema.sql").
            addScript("data-1.sql").
            build();

}

@Bean(name = "DS2")
public EmbeddedDatabase dataSource2() {
    return new EmbeddedDatabaseBuilder().
            setType(EmbeddedDatabaseType.H2).
            setName("DB2").
            addScript("schema.sql").
            addScript("data-2.sql").
            build();

}

最佳答案

您已经创建了两个数据源,并将其中一个标记为 @Primary —— 这是在自动配置 EntityManagerFactories 和存储库时将使用的数据源。这就是两个 DAO 访问同一数据库的原因。

为了解决这个问题,您需要声明两个单独的 EntityManagerFactories,如 Spring Boot 文档中所述:

http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#howto-use-two-entity-managers

之后,您需要声明两个单独的存储库并告诉每个存储库要使用哪个 EntityManagerFactory。为此,您必须在 @EnableJpaRepositories 注释中指定正确的 EntityMangerFactory。本文很好地描述了如何做到这一点:

http://scattercode.co.uk/2013/11/18/spring-data-multiple-databases/

如果 Spring Boot 支持使用两个数据源进行自动配置,那就太好了,但我认为这不会很快发生:

https://github.com/spring-projects/spring-boot/issues/808

更新

上述文章的作者发布了更新的方法:

https://scattercode.co.uk/2016/01/05/multiple-databases-with-spring-boot-and-spring-data-jpa/

关于Spring + 内存中的多个H2实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31588946/

相关文章:

java - Spring @PreDestroy : No logging because Logback stops too soon

java - Log4j和AOP,如何获取实际的类名

java - 如何在我的maven项目中导入FFMPEG库?

Grails 数据源在服务中变为空

swift - numberOfRowsInSection 函数的参数

java - 为什么运行 mvn clean install 命令(在 Spring Boot 项目上)如果我注释掉这些方法来跳过测试,我也会遇到单元测试失败?

java - 是否可以在上下文配置中指定一个 @Component 类,以便自动解析它的依赖项?

java - 运行时重新安排 @scheduled cron 表达式,无需重新启动应用程序

java - 非 Web 应用程序的 SockJS Java 客户端实现

java - 使用多个 Spring Boot 和 JDBC 数据源