【问题标题】:Why can't spring boot/data automagically configure multiple data sources?为什么spring boot/data不能自动配置多个数据源?
【发布时间】:2019-07-13 07:53:12
【问题描述】:

我有一个连接到两个数据库的 Spring Boot 应用程序。 一切正常。

我的包结构如下所示

- db
  - bar
    - BarDbConfig.java
    - domain
      - BarModel.java
    - repo
      - BarRepo.java
  - foo
    - FooDbConfig.java
    - domain
      - FooModel.java
    - repo
      - FooRepo.java

application.properties

spring.jpa.database=default
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
spring.jpa.hibernate.ddl-auto=none
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

#first db
bar.datasource.jdbc-url=jdbc:h2:C:\\Project\\com.example\\db3.data
bar.datasource.username=admin
bar.datasource.password=admin
bar.datasource.driver-class-name=org.h2.Driver

#second db
foo.datasource.jdbc-url=jdbc:h2:C:\\Project\\com.example\\db2.data
foo.datasource.username=admin
foo.datasource.password=admin
foo.datasource.driver-class-name=org.h2.Driver

BarDbConfig.java

@Configuration
@EnableJpaRepositories(
        entityManagerFactoryRef = "barEntityManagerFactory",
        transactionManagerRef = "barTransactionManager"
)
public class BarDbConfig {

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

    @Primary
    @Bean
    public LocalContainerEntityManagerFactoryBean barEntityManagerFactory(
            EntityManagerFactoryBuilder builder,
            @Qualifier("barDataSource") DataSource dataSource
    ) {
        return builder.dataSource(dataSource)
                .packages(BarDbConfig.class.getPackage().getName())
                .persistenceUnit("barPersistenceUnit")
                .build();
    }

    @Primary
    @Bean
    public PlatformTransactionManager barTransactionManager(
            @Qualifier("barEntityManagerFactory") EntityManagerFactory entityManagerFactory) {
        return new JpaTransactionManager(entityManagerFactory);
    }
}

FooDbConfig.java

@Configuration
@EnableJpaRepositories(
        entityManagerFactoryRef = "fooEntityManagerFactory",
        transactionManagerRef = "fooTransactionManager"
)
public class FooDbConfig {

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

    @Bean
    public LocalContainerEntityManagerFactoryBean fooEntityManagerFactory(
            EntityManagerFactoryBuilder builder,
            @Qualifier("fooDataSource") DataSource dataSource
    ) {
        return builder.dataSource(dataSource)
                .packages(FooDbConfig.class.getPackage().getName())
                .persistenceUnit("fooPersistenceUnit")
                .build();
    }

    @Bean
    public PlatformTransactionManager fooTransactionManager(
            @Qualifier("fooEntityManagerFactory") EntityManagerFactory entityManagerFactory) {
        return new JpaTransactionManager(entityManagerFactory);
    }
}

但是,我想知道所有这些样板代码是否真的有必要?

  • 有没有什么办法可以删除所有LocalContainerEntityManagerFactoryBeanPlatformTransactionManager 的东西?
  • 是否有必要提供所有这些明确的Qualifier-names?
  • spring boot 无法自行查找和自动配置数据源??
  • 使用约定优于配置连接到两个数据库所需的绝对最少代码是多少?

【问题讨论】:

  • '回到过去'这一切都将在 XML 中完成。但是要做你需要的(多个数据源)..你需要你当前使用的注释......

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


【解决方案1】:

我只回答你在标题中提出的一个问题,然后在你的问题正文中再次回答:

spring boot 无法自行查找和自动配置DataSources?

99% 的应用程序使用一个数据库,在这些情况下,您想要发生什么很明显,这就是 Boot 为您做的事情。

如果您的应用程序中有 2 个数据库,则有许多问题没有合理的默认答案:

哪些存储库应该使用哪个DataSource?按包拆分?每个接口有两个存储库吗?有路由DataSource?它应该按照什么标准来路由请求?

您想要一个跨多个DataSources 的事务还是单独的事务?或者两者都适用于不同的用例?

当然,Boot 可以为所有这些问题选择一个可能的答案,但结果只会对已经很小的开发人员群体中的一小部分有帮助。 因此它没有完成。

当然,如果您发现几乎总是以某种方式完成的事情,我相信 Spring Boot 开发人员会欣赏功能请求。

【讨论】:

  • 感谢您的回答。所以这是处理多个数据源的最短方法。但仍然想知道为什么他们没有实现这一点,因为我发布的代码是所有教程都是如何做到的。因此,可能 99% 的使用多个数据源的人都像我一样这样做。但无论如何,谢谢你
猜你喜欢
  • 2017-06-04
  • 2021-03-16
  • 1970-01-01
  • 2016-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多