Spring Boot应用程序中的两个数据源

时间:2014-12-12 16:59:20

标签: java spring spring-data spring-boot spring-data-jpa

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

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

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

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

datasource.db1.url=...
...
datasource.db2.url=...
...

由于db1@Primary数据源,因此默认选择它。如何告诉扩展JpaRepository的界面应该使用db2呢?

更新:提到我的存储库是一个界面。

2 个答案:

答案 0 :(得分:0)

您可以从应用程序上下文中获取与辅助数据源关联的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 {
     ...
    }

答案 1 :(得分:0)

基于this,您可以通过这种方式定义多个DataSource

@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 {
    ...
}

存储库应该知道被出价给该类的DataSource使用哪个数据库

相关问题