настройка нескольких источников данных и использование в sping boot 2 с использованием hikari - PullRequest
0 голосов
/ 09 марта 2019

Я настроил две базы данных Postgres с пружинной загрузкой, но Spring всегда показывает первичную базу данных и игнорирует вторичную, любая помощь приветствуется.

ниже - моя конфигурация

application.properties

#datasource 1
    spring.datasource.url= jdbc:postgresql://localhost:5432/db1
    spring.datasource.username=user1
    spring.datasource.password=user1

#data source 2    
    spring.datasource2.url= jdbc:postgresql://localhost:5432/db2
    spring.datasource2.username=user2
    spring.datasource2.password=user2

Ниже приведена конфигурация для источника данных 1 У меня есть несколько хранилищ и сущностей в источнике данных 1, и это мой основной источник данных.

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
        entityManagerFactoryRef = "primaryEntityManager",
        transactionManagerRef = "primaryTransactionManager",
        basePackages = {"pkg.user_service.repository","pkg.master.repository","pkg.Wallet.repository","pkg.security.repositories",
                "pkg.product_service.repository","pkg.OMS.repository","pkg.LMS.repository","pkg.payment.repository"}
)    
public class DataSource1_config {  

 @Bean
    @Primary
    @ConfigurationProperties("spring.datasource")
    public HikariDataSource dataSource(DataSourceProperties properties) {
        return properties.initializeDataSourceBuilder().type(HikariDataSource.class)
                .build();
    }



      @Primary
        @Bean(name = "primaryEntityManager")
        public LocalContainerEntityManagerFactoryBean primaryEntityManagerFactory(EntityManagerFactoryBuilder builder) {
            return builder
                        .dataSource(dataSource(null))
                       .packages("pkg") 
                        .persistenceUnit("primaryPU")
                        .build();
        }

      @Primary
        @Bean(name = "primaryTransactionManager")
        public PlatformTransactionManager primaryTransactionManager(@Qualifier("primaryEntityManager") EntityManagerFactory entityManagerFactory) {
            return new JpaTransactionManager(entityManagerFactory);
        }


}

Ниже приведена конфигурация для источника данных2, в источнике данных 2 есть один репозиторий и сущность.

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
        entityManagerFactoryRef = "secondEntityManager",
        transactionManagerRef = "secondTransactionManager",             
        basePackages = {"device_info.repository"}
)

public class DataSource2_config {   

    @Bean 
    @ConfigurationProperties(prefix = "spring.datasource2")
     public HikariDataSource secondSource(DataSourceProperties properties) {
        return properties.initializeDataSourceBuilder().type(HikariDataSource.class)
                .build();
    }


        @Bean(name = "secondEntityManager")
        public LocalContainerEntityManagerFactoryBean secondEntityManagerFactory(EntityManagerFactoryBuilder builder) {
            return builder
                        .dataSource(secondSource(null))
                        .packages(User_Device_Info.class) 
                        .persistenceUnit("secondPU")
                        .build();
        }



        @Bean(name = "secondTransactionManager")
        public PlatformTransactionManager secondTransactionManager(@Qualifier("secondEntityManager") EntityManagerFactory entityManagerFactory) {
            return new JpaTransactionManager(entityManagerFactory);
        }



}

1 Ответ

0 голосов
/ 12 мая 2019

Я сделал проект, в котором я могу создать несколько источников данных с вашими конкретными наборами изменений, поэтому, если вам нужно добавить другой источник данных, он просто изменит ваш application.yml, больше не нужно менять код.

Класс конфигурации

@Configuration
@ConditionalOnProperty(prefix = "spring.liquibase", name = "enabled", matchIfMissing = true)
@EnableConfigurationProperties(LiquibaseProperties.class)
@AllArgsConstructor
public class LiquibaseConfiguration {

    private LiquibaseProperties properties;
    private DataSourceProperties dataSourceProperties;

    @Bean
    @DependsOn("tenantRoutingDataSource")
    public MultiTenantDataSourceSpringLiquibase liquibaseMultiTenancy(Map<Object, Object> dataSources,
                                                                      @Qualifier("taskExecutor") TaskExecutor taskExecutor) {
        // to run changeSets of the liquibase asynchronous
        MultiTenantDataSourceSpringLiquibase liquibase = new MultiTenantDataSourceSpringLiquibase(taskExecutor);
        dataSources.forEach((tenant, dataSource) -> liquibase.addDataSource((String) tenant, (DataSource) dataSource));
        dataSourceProperties.getDataSources().forEach(dbProperty -> {
            if (dbProperty.getLiquibase() != null) {
                liquibase.addLiquibaseProperties(dbProperty.getTenantId(), dbProperty.getLiquibase());
            }
        });

        liquibase.setContexts(properties.getContexts());
        liquibase.setChangeLog(properties.getChangeLog());
        liquibase.setDefaultSchema(properties.getDefaultSchema());
        liquibase.setDropFirst(properties.isDropFirst());
        liquibase.setShouldRun(properties.isEnabled());
        return liquibase;
    }

}

application.yml

spring:
  dataSources:
    - tenantId: db1
      url: jdbc:postgresql://localhost:5432/db1
      username: postgres
      password: 123456
      driver-class-name: org.postgresql.Driver
      liquibase:
        enabled: true
        default-schema: public
        change-log: classpath:db/master/changelog/db.changelog-master.yaml
    - tenantId: db2
      url: jdbc:postgresql://localhost:5432/db2
      username: postgres
      password: 123456
      driver-class-name: org.postgresql.Driver
    - tenantId: db3
      url: jdbc:postgresql://localhost:5432/db3
      username: postgres
      password: 123456
      driver-class-name: org.postgresql.Driver

См. Полный код: https://github.com/dijalmasilva/spring-boot-multitenancy-datasource-liquibase

...