簡體   English   中英

為什么Spring Boot / Data無法自動配置多個數據源?

[英]Why can't spring boot/data automagically configure multiple data sources?

我有一個連接到兩個數據庫的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 -name?
  • Spring Boot自身無法找到並自動配置數據源嗎?
  • 使用約定優於配置連接到兩個數據庫所需的絕對最低限度的代碼是什么?

我將在標題中回答您提出的一個問題,然后在問題正文中再次回答:

Spring Boot自身無法找到並自動配置DataSource嗎?

99%的應用程序使用一個數據庫,在這些情況下,很明顯您想要發生什么,這就是Boot為您所做的。

如果您的應用程序中有2個數據庫,那么會有很多問題沒有合理的默認答案:

哪些存儲庫應使用哪個DataSource 按包拆分? 每個接口都有兩個存儲庫? 有路由DataSource 應該以什么標准來處理請求?

您是要跨多個DataSource交易還是要進行單獨的交易? 或兩者都適用於不同的用例?

當然,Boot可以為所有這些問題選擇一個可能的答案,但是結果僅對已經很小的一組開發人員的一小部分有用。 因此,它沒有完成。

當然,如果您發現某些事情幾乎總是以某種方式完成的,那么我確定Spring Boot開發人員會贊賞功能請求。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM