ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • spring boot 다중 커넥션 multiple dataSource + hikari
    IT/spring 2020. 9. 30. 03:41

    구성

    1. Database1 = d1
    2. 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

    댓글

Designed by Tistory.