【问题标题】:Multiple DataSources across 2 components跨 2 个组件的多个数据源
【发布时间】:2021-11-14 07:41:09
【问题描述】:

我有 2 个 Spring Boot 应用程序 App1App2App2 可以作为独立应用程序运行,也可以作为依赖项嵌入到应用程序App1 中。我希望 App1 能够调用 App2 的服务,从而对不同的数据库进行 repo 调用。我在两个组件中都配置了 DataSource bean,如下所示:

App1

  @Configuration
  @EnableJpaRepositories(basePackages = "com.ev.app1.repositories",
  entityManagerFactoryRef = "app1EntityManagerFactory",
  transactionManagerRef = "app1TransactionManager")
  public class PersistenceApp1Configuration {
    @Bean
    @ConfigurationProperties(prefix = "app.datasource.app1")
    public DataSourceProperties app1DataSourceProperties() {
      return new DataSourceProperties();
    }

    @Bean(name = "app1DataSource")
    @ConfigurationProperties(prefix = "app.datasource.app1")
    public DataSource tmDataSource() {
      return tmDataSourceProperties().initializeDataSourceBuilder()
      .type(BasicDataSource.class).build();
    }

App1 应用程序.properties:

app.datasource.app1.url=jdbc:postgresql://localhost:5432/mercury_tmdb?currentSchema=txm
app.datasource.app1.username=postgres
app.datasource.app1.password=root
app.datasource.app1.driverClassName=org.postgresql.Driver

App2

  @Configuration
  @EnableJpaRepositories(basePackages = "com.ev.app1.repositories",
  entityManagerFactoryRef = "app1EntityManagerFactory",
  transactionManagerRef = "app1TransactionManager")
  public class PersistenceApp1Configuration {
    @Bean
    @ConfigurationProperties(prefix = "app.datasource.app1")
    public DataSourceProperties app1DataSourceProperties() {
      return new DataSourceProperties();
    }

    @Bean(name = "app2DataSource")
    @Primary
    @ConfigurationProperties(prefix = "app.datasource.app2")
    public DataSource app2DataSource() {
    return tmDataSourceProperties().initializeDataSourceBuilder()
      .type(BasicDataSource.class).build();
    }

App2 应用程序.properties:

app.datasource.app2.url=jdbc:postgresql://localhost:5432/mercury_cldb?currentSchema=led
app.datasource.app2.username=postgres
app.datasource.app2.password=root
app.datasource.app2.driverClassName=org.postgresql.Driver

如您所见,我必须将 App2 中的 DataSource bean 标记为 @Primary 以覆盖默认的 spring 数据源。但是对于 App1 我不能这样做,因为它已经有一个来自 App2 的 Primary bean。有什么解决方法吗?或者我可能完全不喜欢这种方法?

注意:我还有其他配置 bean,我没有在这里显示,但如果需要我可以分享

【问题讨论】:

  • 您如何使用数据源?您是在告诉您的数据访问服务使用某些特定的还是只是使用 Spring 的默认配置?
  • @WilliamAndrésBernal 我已经添加了从中获取数据库信息的属性文件
  • 我试图更好地提出我的问题。服务如何知道必须使用哪个数据源?您的代码中是否对此进行了任何配置,或者您只是让 spring 来完成它的工作?
  • 我使用@EnableJpaRepositories 将包设置为扫描、EMF 和TM。我希望这能回答你的问题。也编辑了问题。
  • 如果我理解正确,这两个服务都在同一个源代码存储库中?如果是这样,您可以使用 spring profile 来创建基于应用程序的数据源。 intertech.com/spring-4-conditional-bean-configuration

标签: java spring-boot hibernate datasource


【解决方案1】:

您可以使用 Spring 中的条件 bean 配置,因此您可以决定何时使用每个数据源。

你可以像这样使用注解:

@ConditionalOnExpression(value = "${module.enabled} and ${module.submodule.enabled}")

取决于您的具体配置。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-03
    • 2022-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多