Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.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_Spring Data Jpa - Fatal编程技术网

Java Spring启动应用程序中的两个数据源

Java Spring启动应用程序中的两个数据源,java,spring,spring-data,spring-boot,spring-data-jpa,Java,Spring,Spring Data,Spring Boot,Spring Data Jpa,我有一个Spring Boot应用程序,我为它配置了两个数据源。到目前为止,我已经在我的应用程序类中配置了数据源(用@EnableAutoConfiguration注释): 我还将配置值添加到application.properties: datasource.db1.url=... ... datasource.db2.url=... ... 由于db1是@主数据源,因此默认情况下选择它。如何告诉扩展JpaRepository的接口它应该使用db2 更新:提到我的存储库是一个接口。您可以从应

我有一个Spring Boot应用程序,我为它配置了两个数据源。到目前为止,我已经在我的
应用程序
类中配置了数据源(用
@EnableAutoConfiguration
注释):

我还将配置值添加到
application.properties

datasource.db1.url=...
...
datasource.db2.url=...
...
由于
db1
@主
数据源,因此默认情况下选择它。如何告诉扩展
JpaRepository
的接口它应该使用
db2


更新:提到我的存储库是一个接口。

您可以从应用程序上下文中获取与辅助数据源关联的bean。 例如,在
Application.java
(我也在使用Spring Boot)中,您定义:

    @Bean
    @ConfigurationProperties(prefix="datasource.secondary")
    public DataSource secondaryDataSource() {
        return DataSourceBuilder.create().build();
    }
在服务(此处用于调用存储过程)中,您有:

@Service
public class EngineImpl implements EngineDao {

    private SetScartiProcedure setScarti;   

    @Autowired  
    public void init(ApplicationContext ctx) {
        DataSource dataSource = (DataSource) ctx.getBean("secondaryDataSource");
        this.setScarti = new SetScartiProcedure(dataSource);
    }

    public class SetScartiProcedure extends StoredProcedure {
     ...
    }
基于此,您可以通过这种方式定义多个
数据源

@Bean
public LocalContainerEntityManagerFactoryBean customerEntityManagerFactory(
        EntityManagerFactoryBuilder builder) {
    return builder
            .dataSource(customerDataSource())
            .packages(Customer.class)
            .persistenceUnit("customers")
            .build();
}

@Bean
public LocalContainerEntityManagerFactoryBean orderEntityManagerFactory(
        EntityManagerFactoryBuilder builder) {
    return builder
            .dataSource(orderDataSource())
            .packages(Order.class)
            .persistenceUnit("orders")
            .build();
}
然后将它们各自绑定到各自管理的不同类

@Configuration
@EnableJpaRepositories(basePackageClasses = Customer.class,
        entityManagerFactoryRef = "customerEntityManagerFactory")
public class CustomerConfiguration {
    ...
}

@Configuration
@EnableJpaRepositories(basePackageClasses = Order.class,
        entityManagerFactoryRef = "orderEntityManagerFactory")
public class OrderConfiguration {
    ...
}

存储库应该知道向该类提交的
数据源
要使用哪个数据库

您可以使用不同的persistence单元吗?请看这里:我不确定如何将这种方法用于存储库接口,Spring使用这种方法自动生成实现。我想这里有一个简单的例子:@Patrick:太晚了半分钟。我也发现。。。谷歌首次点击“spring数据多数据源”可能重复:
@Configuration
@EnableJpaRepositories(basePackageClasses = Customer.class,
        entityManagerFactoryRef = "customerEntityManagerFactory")
public class CustomerConfiguration {
    ...
}

@Configuration
@EnableJpaRepositories(basePackageClasses = Order.class,
        entityManagerFactoryRef = "orderEntityManagerFactory")
public class OrderConfiguration {
    ...
}