Tuesday, July 20, 2021

Spring Multi DataSource

 Spring Supports for Mulit DataBase JPA


#Add the same in Application.porperties
database1.datasource.url =jdbc:oracle:thin:@localhost:1521:first
database1.datasource.username =first
database1.datasource.password =first
database1.datasource.driver-class-name=oracle.jdbc.driver.OracleDriver
database2.datasource.url =jdbc:oracle:thin:@localhost:1521:second
database2.datasource.username =second
database2.datasource.password =second
database2.datasource.driver-class-name=oracle.jdbc.driver.OracleDriver



You would nee to create  two ava files one for primary DB and oher for secoandary, 

Primary class to be annotated with 
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = "com.multi.db.primary.repo",
        entityManagerFactoryRef = "databas1EntityManagerFactory",
        transactionManagerRef= "databas1TransactionManager)

would also need belwo given funcions 

@Bean(name = "datasource1")
  @Primary
  public DataSource dataSource1(){
    return database1SourcePorperties()
        .initializeDataSourceBuilder()
        .type(HikariDataSource.class).build();
  }
  
  @Primary
  @Bean(name = "databas1EntityManagerFactory")
  public LocalContainerEntityManagerFactoryBean databas1EntityManagerFactory(EntityManagerFactoryBuilder builder) {
      return builder
              .dataSource(dataSource1())
              .packages(Users.class)
              .build();
  }
  
  @Bean
  @Primary
  @ConfigurationProperties("database1.datasource")
  public DataSourceProperties database1SourcePorperties() {
    return new DataSourceProperties();
  }
  
  @Bean(name="databas1TransactionManager")
  @Primary
  public JpaTransactionManager db1TM(final @Qualifier ("databas1EntityManagerFactory") LocalContainerEntityManagerFactoryBean db1Factorybean) {
      return new JpaTransactionManager(db1Factorybean.getObject());
  }


#Complete class for Secondary DataSource

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = "com.multi.db.secondary.repo",
        entityManagerFactoryRef = "database2EntityManagerFactory",
        transactionManagerRef= "database2TransactionManager"
)
public class SecondaryDataSource {
  
  @Bean(name = "datasource2")
  public DataSource dataSource2(){
      return database2SourcePorperties().initializeDataSourceBuilder().type(BasicDataSource.class).build();
  }
  
  @Bean
  @ConfigurationProperties("database2.datasource")
  public DataSourceProperties database2SourcePorperties() {
    return new DataSourceProperties();
  }
  
  
  @Bean(name = "database2EntityManagerFactory")
  public LocalContainerEntityManagerFactoryBean databas2EntityManagerFactory(EntityManagerFactoryBuilder builder) {
      return builder
              .dataSource(dataSource2())
              .packages("com.multi.db.secondary")
              .build();
  }

  
 
  @Bean(name="database2TransactionManager")
  public JpaTransactionManager db2TM(final @Qualifier ("database2EntityManagerFactory") LocalContainerEntityManagerFactoryBean db2Factorybean) {
      return new JpaTransactionManager(db2Factorybean.getObject());
  }

}