【问题标题】:Spring + multiple H2 instances in memorySpring + 内存中的多个 H2 实例
【发布时间】:2015-10-13 20:27:12
【问题描述】:

要在内存中创建两个不同的 H2 实例。为了确保发生这种情况,我用相同的 shema 和不同的数据初始化了两个实例。这样当我使用 DAO 查询时,从不同的 DataSource 中挑选出不同的数据集。然而,这并没有发生。我究竟做错了什么?如何正确命名 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();

}

【问题讨论】:

  • 你的schema.sql是在创建同名数据库吗?
  • 你不能声明两个相同类型的主要 bean - 这可能是意外行为的原因
  • 这是复制粘贴中的拼写错误。实际上只有第一个 DS 是@Primary。还是不行。
  • @willOEM - 是的 schema.sql 创建相同的表。但数据不一样。通过这种方式,我可以测试我的代码是否真的从 2 个不同的数据库中获取数据。
  • 您可以连接到您的 H2 实例并查看两个数据库吗?我的猜测是只有一个被覆盖。

标签: spring spring-boot datasource h2


【解决方案1】:

您已经创建了两个 DataSource 并将一个标记为 @Primary - 这是在您的 EntityManagerFactories 和 Repositories 自动配置时将使用的一个。这就是为什么两个 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 支持两个 DataSource 的自动配置会很好,但我认为这不会很快发生:

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/

【讨论】:

    【解决方案2】:

    问题不在于 H2 的多个实例;但使用 DataSource 注入。

    我通过在方法参数中传递限定符来解决它。

    @Autowired
    @Bean(name = "jdbcTemplate") 
    public JdbcTemplate getJdbcTemplate(@Qualifier("myDataSource") DataSource dataSource) { 
        return new JdbcTemplate(dataSource); 
    } 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多