Spring Boot JPA:如何避免为相同的数据库创建多个存储库?

时间:2017-02-08 00:03:25

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

我的spring boot mvc项目通过存储库接口与数据库交互,使用Spring启动默认配置很好地工作:

    spring:
       datasource:
       url: jdbc:mysql://localhost/some_schema
       username: 
       ...

    @Configuration
    @EnableJpaRepositories(basePackages = {"my.path.to.repository"})
    public class Application extends WebMvcConfigurerAdapter {
    ....

现在,根据某些运行时条件,我需要在一个单独的位置与相同的第二个数据库(相同的模式)进行交互。我发现的解决方案都指向为每个数据源创建一个单独的存储库包。

由于数据库完全相同,是否有一种优雅的方法可以避免为每个添加的数据源重复存储库包?

1 个答案:

答案 0 :(得分:0)

您可以使用Spring AbstractRoutingDataSource完成此操作。

大致是:

public class ChooseOneDataSource extends AbstractRoutingDataSource {
    @Override
    protected Object determineCurrentLookupKey() {
        if (***some runtime condition***) {
          return "dataSource1";
        } else {
          return "dataSource2";
        }
    }
}

在你的会议中:

@Bean 
@ConfigurationProperties(prefix = "dataSource1")
DataSource dataSource1() {
 return DataSourceBuilder.create().build();
}

@Bean
@ConfigurationProperties(prefix = "dataSource2")
DataSource dataSource2() {
 return DataSourceBuilder.create().build();
}

@Bean
DataSource dataSource() {
 AbstractRoutingDataSource dataSource = new ChooseOneDataSource();
 Map<Object,Object> resolvedDataSources = new HashMap<>();
 resolvedDataSource.put("dataSource1", dataSource1());
 resolvedDataSource.put("dataSource2", dataSource2());
 dataSource.setDefaultTargetDataSource(dataSource1()); // << default
 dataSource.setTargetDataSources(resolvedDataSources);
 return dataSource;
}

更多信息/示例:

http://fizzylogic.nl/2016/01/24/Make-your-Spring-boot-application-multi-tenant-aware-in-2-steps/ https://spring.io/blog/2007/01/23/dynamic-datasource-routing/