-
spring boot 다중 커넥션 multiple dataSource + hikariIT/spring 2020. 9. 30. 03:41
구성
- Database1 = d1
- Database2 = d2
build.gradle
plugins { id 'org.springframework.boot' version '2.3.4.RELEASE' id 'io.spring.dependency-management' version '1.0.10.RELEASE' id 'java' } group = 'com.khh' version = '0.0.1-SNAPSHOT' sourceCompatibility = '11' configurations { compileOnly { extendsFrom annotationProcessor } } repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' implementation 'org.springframework.boot:spring-boot-starter-web' compileOnly 'org.projectlombok:lombok' implementation 'com.h2database:h2' annotationProcessor 'org.projectlombok:lombok' testImplementation('org.springframework.boot:spring-boot-starter-test') { exclude group: 'org.junit.vintage', module: 'junit-vintage-engine' } } test { useJUnitPlatform() }
application.yaml
spring: application: name: multi logging: config: classpath:logback-spring.xml projects: d1: hibernate: property: "[hibernate.dialect]": org.hibernate.dialect.H2Dialect "[hibernate.show_sql]": false "[hibernate.hbm2ddl.auto]": create-drop "[hibernate.cache.use_second_level_cache]": false "[hibernate.cache.use_query_cache]": false datasource: hikari: jdbc-url: jdbc:h2:./data/test_d1_db driver-class-name: org.h2.Driver username: sa password: d2: hibernate: property: "[hibernate.dialect]": org.hibernate.dialect.H2Dialect "[hibernate.show_sql]": false "[hibernate.hbm2ddl.auto]": create-drop "[hibernate.cache.use_second_level_cache]": false "[hibernate.cache.use_query_cache]": false datasource: hikari: jdbc-url: jdbc:h2:./data/test_d2_db driver-class-name: org.h2.Driver username: sa password:
d1 config (DatabaseConfiguration)
@Configuration("d1-DatabaseConfiguration") @EnableJpaRepositories(basePackages = "com.khh.multidatabases.repository.d1", entityManagerFactoryRef = "d1EntityManager", transactionManagerRef = "d1TransactionManager") public class DatabaseConfiguration { @Bean(value = "d1HibernateProperties") @ConfigurationProperties("projects.d1.hibernate.property") public HashMap<String, Object> d1HibernateProperties() { return new HashMap<String, Object>(); } @Primary @Bean public LocalContainerEntityManagerFactoryBean d1EntityManager() throws SQLException { final LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean(); em.setDataSource(dataSource()); em.setPackagesToScan("com.khh.multidatabases.domain.d1"); final HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter(); em.setJpaVendorAdapter(vendorAdapter); final HashMap<String, Object> properties = d1HibernateProperties(); em.setJpaPropertyMap(properties); return em; } @Primary @Bean public PlatformTransactionManager d1TransactionManager() throws SQLException { final JpaTransactionManager transactionManager = new JpaTransactionManager(); transactionManager.setEntityManagerFactory(d1EntityManager().getObject()); return transactionManager; } @Bean(value = "d1HikariConfig") @ConfigurationProperties(prefix="projects.d1.datasource.hikari") public HikariConfig hikariConfig() { return new HikariConfig(); } //http://www.h2database.com/html/features.html @Primary @Bean(value = "d1DataSource") public DataSource dataSource() throws SQLException { return new HikariDataSource(hikariConfig()); } }
d2 config (DatabaseConfiguration)
@Configuration("d2-DatabaseConfiguration") @EnableJpaRepositories(basePackages = "com.khh.multidatabases.repository.d2", entityManagerFactoryRef = "d2EntityManager", transactionManagerRef = "d2TransactionManager") public class DatabaseConfiguration { @Bean(value = "d2HibernateProperties") @ConfigurationProperties("projects.d2.hibernate.property") public HashMap<String, Object> d1HibernateProperties() { return new HashMap<String, Object>(); } @Bean public LocalContainerEntityManagerFactoryBean d2EntityManager() throws SQLException { final LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean(); em.setDataSource(dataSource()); em.setPackagesToScan("com.khh.multidatabases.domain.d2"); final HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter(); em.setJpaVendorAdapter(vendorAdapter); final HashMap<String, Object> properties = d1HibernateProperties(); em.setJpaPropertyMap(properties); return em; } @Bean public PlatformTransactionManager d2TransactionManager() throws SQLException { final JpaTransactionManager transactionManager = new JpaTransactionManager(); transactionManager.setEntityManagerFactory(d2EntityManager().getObject()); return transactionManager; } @Bean(value = "d2HikariConfig") @ConfigurationProperties(prefix="projects.d2.datasource.hikari") public HikariConfig hikariConfig() { return new HikariConfig(); } //http://www.h2database.com/html/features.html @Bean(value = "d2DataSource") @ConfigurationProperties("projects.d2.datasource") public DataSource dataSource() throws SQLException { return new HikariDataSource(hikariConfig()); } }
d1 controller
import com.khh.multidatabases.domain.d1.User; import com.khh.multidatabases.repository.d1.D1UserRepositry; @RestController @RequestMapping(D1UserController.URI_PREFIX) public class D1UserController { public static final String URI_PREFIX = "/d1/users"; D1UserRepositry d1UserRepositry; public D1UserController(D1UserRepositry userRepositry) { this.d1UserRepositry = userRepositry; } @GetMapping(value = {"", "/"}) public List<User> index() { return d1UserRepositry.findAll(); } @GetMapping(value = "/create") public User create() { return d1UserRepositry.save(User.builder().name(UUID.randomUUID().toString()).build()); } }
d2 controller
import com.khh.multidatabases.domain.d2.User; import com.khh.multidatabases.repository.d2.D2UserRepositry; @RestController @RequestMapping(D2UserController.URI_PREFIX) public class D2UserController { public static final String URI_PREFIX = "/d2/users"; @Autowired D2UserRepositry d2UserRepositry; public D2UserController() { } @GetMapping(value = {"", "/"}) public List<User> index() { return d2UserRepositry.findAll(); } @GetMapping(value = "/create") public User create() { return d2UserRepositry.save(User.builder().name(UUID.randomUUID().toString()).build()); } }
github https://github.com/visualkhh/lib-spring/tree/master/boot/multi-database
'IT > spring' 카테고리의 다른 글
spring boot 정리 (locale, messageSource, security, jpa, hibernate, Scheduler, config) (0) 2021.02.04 spring boot 에서 JOOQ 사용시, 구동 1분이상 느려짐 현상 (버그) (0) 2021.02.04 spring에서 FCM (firebase cloud messaging) push 보내기. (11) 2021.02.04 JWT Token을 spring security에서 손쉽게 검증하기 위한 방법 (0) 2021.01.26 spring boot jwt (0) 2020.12.25