要在内存中创建两个不同的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();
}
答案 0 :(得分:1)
您已经创建了两个DataSource并将其标记为@Primary - 这是在您的EntityManagerFactories和Repositories自动配置时使用的数据源。这就是为什么两个DAO都在访问同一个数据库。
为了解决这个问题,你需要声明两个独立的EntityManagerFactories,如Spring Boot文档中所述:
之后,您需要声明两个单独的存储库,并告诉每个存储库使用哪个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);
}