Skip to content

Multiple Datasource

Phong207 edited this page Jun 26, 2022 · 2 revisions

Multiple Datasource

Configuration and notes

Configuration

  1. application properties
  spring.datasource-first.url E.g: jdbc:postgresql://localhost:5432/first-db
  spring.datasource-first.username E.g: username
  spring.datasource-first.password E.g: password

  spring.datasource-second.url E.g:jdbc:postgresql://localhost:5433/second-db
  spring.datasource-second.username E.g: username
  spring.datasource-second.password E.g: password
  1. Config Bean

    1. MultiDatasourceConfiguration
      @Configuration
      public class MultiDatasourceConfiguration {
    
      @Bean
      @ConfigurationProperties("spring.datasource-first")
      @Primary
      public DataSource firstDatasource() {
        return DataSourceBuilder.create()
            .build();
      }
    
      @Bean
      @ConfigurationProperties("spring.datasource-second")
      public DataSource secondDatasource() {
        return DataSourceBuilder.create()
            .build();
      }
    }
    1. FirstJpaConfiguration
    @Configuration
    @EnableTransactionManagement
    @EnableJpaRepositories(
        basePackages = "x1" // package contains the repository
    )
    public class FirstJpaConfiguration {
    
      @Bean
      @Primary
      public LocalContainerEntityManagerFactoryBean firstEntityManagerFactory(
          @Qualifier("firstDatasource") DataSource firstDatasource, EntityManagerFactoryBuilder builder) {
        return builder
            .dataSource(firstDatasource)
            .packages("y1") // package contains the entity
            .build();
      }
    
      @Bean
      @Primary
      public PlatformTransactionManager firstTransactionManager(
          @Qualifier("firstEntityManagerFactory") LocalContainerEntityManagerFactoryBean firstEntityManagerFactory) {
        return new JpaTransactionManager(Objects.requireNonNull(firstEntityManagerFactory.getObject()));
      }
    }
    1. SecondJpaConfiguration
    @Configuration
    @EnableTransactionManagement
    @EnableJpaRepositories(
        basePackages = "x2" // package contains the repository
    )
    public class SecondJpaConfiguration {
    
      @Bean
      public LocalContainerEntityManagerFactoryBean secondEntityManagerFactory(
          @Qualifier("secondDatasource") DataSource secondDatasource, EntityManagerFactoryBuilder builder) {
        return builder
            .dataSource(secondDatasource)
            .packages("y2") // package contains the entity
            .build();
      }
    
      @Bean
      public PlatformTransactionManager secondTransactionManager(
          @Qualifier("secondEntityManagerFactory") LocalContainerEntityManagerFactoryBean secondEntityManagerFactory) {
        return new JpaTransactionManager(Objects.requireNonNull(secondEntityManagerFactory.getObject()));
      }
    }

Notes

  1. Setting for Jpa convert camelCase -> snake_case when query (setting for application properties)

     spring.jpa.properties.hibernate.implicit_naming_strategy=org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy
     spring.jpa.properties.hibernate.physical_naming_strategy=org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy
  2. When use @Transactional must specify "transactionManager" (firstTransactionManager or secondTransactionManager)

  3. When use EntityManager must add @PersistenceContext(unitName = "xx" xx: firstEntityManagerFactory or secondEntityManagerFactory)

  4. If use liquibase then add "spring.liquibase.url" to application properties

   spring.liquibase.url //is url of datasource E.g: jdbc:postgresql://localhost:5432/first-db

Refer

https://www.baeldung.com/spring-boot-configure-multiple-datasources