【问题标题】:Spring Boot JPA: How to avoid creating multiple repositories for identical databases?Spring Boot JPA:如何避免为相同的数据库创建多个存储库?
【发布时间】:2017-02-08 00:03:25
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 不,你必须复制。我会问你为什么需要另一个相同的架构,以及你认为通过“优雅”来节省什么。
  • 一个“优雅”的解决方案是尽可能避免代码重复的解决方案。
  • 这是配置。别无选择:您需要为打算使用的每个数据库进行配置。复制模式比编写三行配置要多得多。也许你应该消除重复的数据库。
  • 最困扰我的是repository包的代码重复
  • 感觉好像你没有抓住重点。您对代码进行了练习,但数据库重复是毫无疑问的。投票结束。

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


【解决方案1】:

您可以使用 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/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-07
    • 2018-03-30
    • 2017-05-25
    • 2020-02-08
    • 2016-12-12
    • 1970-01-01
    • 1970-01-01
    • 2021-02-19
    相关资源
    最近更新 更多