Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何获取Spring数据来处理多个异构数据源?_Java_Spring_Spring Data_Spring Boot - Fatal编程技术网

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

Java 如何获取Spring数据来处理多个异构数据源?,java,spring,spring-data,spring-boot,Java,Spring,Spring Data,Spring Boot,我已经成功地使用了Spring教程。我已经有了自己的crudepository,只需配置一个特定的DataSource@Bean就可以自动工作,它们之间的内部连接由Spring数据(或者springboot,很难说是哪个)管理 然而,我不知道如何让自动管道处理第二个DataSource@Bean。注入第二个会导致自动配置类在启动期间爆炸 你有没有想过怎么做?我为此所做的搜索导致文章讨论了多个同质数据源以实现负载平衡或其他目的,这并不是我真正需要的。我有多个数据库,其中包含完全独立的内容,我需要将

我已经成功地使用了Spring教程。我已经有了自己的crudepository,只需配置一个特定的DataSource@Bean就可以自动工作,它们之间的内部连接由Spring数据(或者springboot,很难说是哪个)管理

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

你有没有想过怎么做?我为此所做的搜索导致文章讨论了多个同质数据源以实现负载平衡或其他目的,这并不是我真正需要的。我有多个数据库,其中包含完全独立的内容,我需要将这些内容拉到这个应用程序中,我真的希望避免仅仅因为第二个数据库进入了这个组合就必须复制所有自动配置


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

您可以创建两个数据源和EntityManager,其中一个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

您正在使用存储库注释吗?如果是,您是否使用EnableRepos设置了配置类或xml配置?如果这两个都是真的,我打赌您缺少一个限定符注释。由于它们都扩展了Repo接口,因此存在自动连线冲突。添加限定符('datasource1')限定符('datasource2')您的注入只需为对服务很重要的源添加限定符即可。@AnthonyJClink我没有使用存储库注释,我只是扩展Crudepository接口,如所示。您可能需要重新表述您的标题,正如您所说的从同一类型的不同后端(SQL)支持不同类型,而不是Spring数据跨存储支持。如果您在Spring boot中添加第二个数据源,则需要将其中一个标记为@Primary,以便通过自动配置进行识别。@chrylis我不清楚我的标题如何建议“跨存储支持”.但是,我该如何使用非主数据源呢?我是否需要手动构建管道?主注释将仅由自动配置使用,只是为了不破坏它。如果您使用的是JdbcTemplate,则必须向数据源注入正确的限定符注释,以便知道将使用哪个数据源。我没有使用JdbcTemplate,我使用的是Crudepository,因为它为我处理所有事情。然而,我看到这些构造的唯一方法是通过自动配置,它显然不能与多个数据源一起工作。我已经更新了配置,因此您可以使用Repositories来工作该代码用于哪些版本的Spring库?它不使用Spring 4.1.4、Spring Boot 1.2.1和Spring数据JPA 1.7.1进行编译。