如何让Spring Data处理多个异构DataSource?

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

但是,我无法弄清楚如何让自动化管道来处理第二个DataSource @Bean。 注入第二个会导致自动配置类在启动期间爆炸。

有关如何做到这一点的任何想法? 我为此做的搜索导致文章讨论了多个同类 DataSource用于负载平衡或其他目的,这实际上不是我需要的。 我有多个数据库,其中包含完全独立的内容,我需要将其引入此应用程序中,我真的希望避免因为第二个数据库进入混合而复制所有自动配置。

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

您可以创建两个数据源和实体管理器,其中一个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