Multiple Datasource
Phong207 edited this page Jun 26, 2022
·
2 revisions
- 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
-
Config Bean
- 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(); } }
- 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())); } }
- 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())); } }
-
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
-
When use @Transactional must specify "transactionManager" (firstTransactionManager or secondTransactionManager)
-
When use EntityManager must add @PersistenceContext(unitName = "xx" xx: firstEntityManagerFactory or secondEntityManagerFactory)
-
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
https://www.baeldung.com/spring-boot-configure-multiple-datasources
Footer