要在内存中创建两个不同的 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 文档中所述:
之后,您需要声明两个单独的存储库并告诉每个存储库要使用哪个 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/