【问题标题】:Two data sources in a Spring Boot applicationSpring Boot 应用程序中的两个数据源
【发布时间】:2014-12-12 16:59:20
【问题描述】:

我有一个 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 代替?

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

【问题讨论】:

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    基于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 使用哪个数据库

    【讨论】:

      猜你喜欢
      • 2015-07-10
      • 2016-12-23
      • 2015-11-11
      • 2017-03-30
      • 2018-01-28
      • 2020-10-12
      • 1970-01-01
      • 1970-01-01
      • 2018-06-29
      相关资源
      最近更新 更多