如何获取 Spring 数据来处理多个异构数据源?

How to get Spring Data to handle multiple heterogeneous DataSources?

我已经成功使用 Accessing Data With JPA 教程 Spring。我已经获得了我自己的 CrudRepository,只需配置一个特定的 DataSource @Bean 即可自动工作,并且它们之间的内部连接由 Spring Data(或 Spring Boot,很难分辨是哪个).

但是,我不知道如何让自动管道处理第二个 DataSource @Bean。注入第二个会导致自动配置 类 在启动期间爆炸。

关于如何做到这一点有什么想法吗?我为此所做的搜索导致文章讨论了多个 homogeneous DataSources 用于负载平衡或其他目的,这实际上不是我需要的。我有多个数据库,它们的内容完全不同,我需要将它们引入到这个应用程序中,我真的很想避免仅仅因为第二个数据库进入组合就必须复制所有的自动化配置。

我希望这很简单,但我担心这是自动配置中不受支持的边缘情况。

您可以创建两个数据源和实体管理器,其中一个 bean 标记为@Primary

@Configuration
@EnableJpaRepositories(basePackages = "io.eddumelendez.springdatajpa.repository1")
public class FirstConfiguration {

    @ConfigurationProperties(prefix = "datasource.postgres")
    @Bean
    @Primary
    public DataSource postgresDataSource() {
        return DataSourceBuilder.create().
                build();
    }

    @Bean(name = "entityManagerFactory")
    @Primary
    public LocalContainerEntityManagerFactoryBean emf1(EntityManagerFactoryBuilder builder){
        return builder
                .dataSource(postgresDataSource())
                .packages("io.eddumelendez.springdatajpa.domain1")
                .persistenceUnit("users")
                .build();
    }

}

另一个数据源的配置:

@Configuration
@EnableJpaRepositories(basePackages = "io.eddumelendez.springdatajpa.repository2", entityManagerFactoryRef = "emf2")
public class SecondConfiguration {

    @Bean
    @ConfigurationProperties(prefix = "datasource.mysql")
    public DataSource mysqlDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean
    public LocalContainerEntityManagerFactoryBean emf2(EntityManagerFactoryBuilder builder){
        return builder
                .dataSource(mysqlDataSource())
                .packages("io.eddumelendez.springdatajpa.domain2")
                .persistenceUnit("customers")
                .build();
    }

}

您的 application.properties 应如下所示:

datasource.mysql.url=jdbc:mysql://localhost:3306/mysql_demo
datasource.mysql.username=root
datasource.mysql.password=root

datasource.postgres.url=jdbc:postgresql://localhost:5432/postgres_demo
datasource.postgres.username=postgres
datasource.postgres.password=postgres