Spring +内存中的多个H2实例

时间:2015-07-23 13:33:44

标签: spring spring-boot datasource h2

要在内存中创建两个不同的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();

}

2 个答案:

答案 0 :(得分: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/

答案 1 :(得分:1)

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

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

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