Spring Boot 2.0.X 다중 데이터 소스 및 연결 풀 구성

11156 단어
1. 단일 데이터 소스
Spring Boot 설정서 데이터 원본을 사용할 때 간단합니다. 설정 파일에 기본적인 데이터베이스 연결 정보와 연결 탱크 설정 정보를 추가하면 됩니다. 일반적인 경우driver-class-name을 지정하지 않아도 됩니다. Spring Boot는 대부분의 데이터베이스 URL에서 드라이브 유형을 추정할 수 있습니다.
#     
spring.datasource.url=jdbc:mysql://localhost:part/test?characterEncoding=utf-8
spring.datasource.username=****
spring.datasource.password=****
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

#      
spring.datasource.hikari.pool-name=HikariPool
spring.datasource.hikari.minimum-idle=5
spring.datasource.hikari.maximum-pool-size=10
spring.datasource.hikari.connection-timeout=30000
spring.datasource.hikari.idle-timeout=600000
spring.datasource.hikari.max-lifetime=1800000

# jpa    
spring.jpa.show-sql = true
spring.jpa.properties.hibernate.format_sql = true
spring.jpa.properties.hibernate.max_fetch_depth = 1
spring.jpa.hibernate.ddl-auto = update
# SpringBoot2.0            InnoDB  
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
spring.jpa.open-in-view=false

Spring Boot 2.0 이후에는 기본적으로 HikaricP 연결 풀을 사용하고, 2.0 이전에는 Tomcat 연결 풀을 사용했으며, 2.0 이전에는 HikaricP 연결 풀을 사용하려면 maven에서 수동으로 HikaricP 연결 풀을 도입하여 의존할 수 있습니다

       com.zaxxer
       HikariCP
       2.7.8


다음 설정을 프로필에 추가하면 됩니다
spring.datasource.type=com.zaxxer.hikari.HikariDataSource

2. 다중 데이터 소스
1. 다중 데이터 소스 연결 설정을 설정하고 접두사에 따라 구분하며 연결 탱크 정보를 설정합니다
#    
spring.datasource.primary.jdbc-url=jdbc:mysql://127.0.0.1:3306/test1?characterEncoding=utf-8
spring.datasource.primary.username=root
spring.datasource.primary.password=mysql
spring.datasource.primary.driver-class-name = com.mysql.jdbc.Driver
#    
spring.datasource.secondary.jdbc-url=jdbc:mysql://127.0.0.1:3306/test2?characterEncoding=utf-8
spring.datasource.secondary.username=root
spring.datasource.secondary.password=mysql
spring.datasource.secondary.driver-class-name = com.mysql.jdbc.Driver

##  Hikari       ------        :https://github.com/brettwooldridge/HikariCP
##      
spring.datasource.primary.pool-name=HikariPool-1
##         ,   10
spring.datasource.primary.minimum-idle=5
##         ,   10
spring.datasource.primary.maximum-pool-size=10
##           ,  600000(10  )
spring.datasource.primary.idle-timeout=600000
##                 , 0        ,  1800000 30  
spring.datasource.primary.max-lifetime=1800000
##          ,  30 , 30000
spring.datasource.primary.connection-timeout=30000

spring.datasource.secondary.pool-name=HikariPool-2
spring.datasource.secondary.minimum-idle=5
spring.datasource.secondary.maximum-pool-size=10
spring.datasource.secondary.idle-timeout=600000
spring.datasource.secondary.max-lifetime=1800000
spring.datasource.secondary.connection-timeout=30000

# jpa    
spring.jpa.show-sql = true
spring.jpa.properties.hibernate.format_sql = true
spring.jpa.properties.hibernate.max_fetch_depth = 1
spring.jpa.hibernate.ddl-auto = update
# SpringBoot2.0            InnoDB  
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
spring.jpa.open-in-view=false

2. 수동으로 여러 개의 데이터베이스 연결 탱크를 만들고prefix 설정 속성의 접두사는 설정 파일의 접두사와 일치해야 하며 실례화 Bean은 Spring 용기 관리에 맡깁니다
package com.***.***.config.datasource;

import com.zaxxer.hikari.HikariDataSource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;

import javax.sql.DataSource;

@Slf4j
@Configuration
public class DataSourceConfig {

    @Bean(name = "primaryDataSource")
    @Primary
    @ConfigurationProperties(prefix = "spring.datasource.primary")
    public DataSource primaryDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "secondaryDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.secondary")
    public DataSource secondaryDataSource() {
        return DataSourceBuilder.create().build();
    }


    /**
     *           
     *
     * @param dataSource
     */
    public static void logDS(DataSource dataSource) {
        HikariDataSource hds = (HikariDataSource) dataSource;
        String info = "

\tHikariCP
\t :" + hds.getPoolName() + "
\t :" + hds.getMinimumIdle() + "
\t :" + hds.getMaximumPoolSize() + "
\t :" + hds.getConnectionTimeout() + "ms
\t :" + hds.getIdleTimeout() + "ms
\t :" + hds.getMaxLifetime() + "ms
"; log.info(info); } }

3. 모든 연결 탱크에 대응하는 실체 클래스와 Repository 패키지 경로를 지정하고 실체 관리, jpa 속성 관리, 사무 관리 설정을 추가한다.jpa 속성은 설정 파일에서 통일적으로 설정하거나 다음과 같은 getVendorProperties 방법으로 분리할 수 있습니다. 특히 서로 다른 데이터베이스에 연결할 때.
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.orm.jpa.HibernateSettings;
import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties;
import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;

import javax.persistence.EntityManager;
import javax.sql.DataSource;
import java.util.Map;

@Slf4j
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
        entityManagerFactoryRef = "entityManagerFactoryPrimary",
        transactionManagerRef = "transactionManagerPrimary",
        basePackages = {"com.***.***.repository.applet"}) //  Repository    
public class PrimaryConfig {

    @Autowired
    @Qualifier("primaryDataSource")
    private DataSource primaryDataSource;

    @Autowired
    private JpaProperties jpaProperties;

    @Primary
    @Bean(name = "entityManagerPrimary")
    public EntityManager entityManager(EntityManagerFactoryBuilder builder) {
        return entityManagerFactoryPrimary(builder).getObject().createEntityManager();
    }

    @Primary
    @Bean(name = "entityManagerFactoryPrimary")
    public LocalContainerEntityManagerFactoryBean entityManagerFactoryPrimary(EntityManagerFactoryBuilder builder) {
        DataSourceConfig.logDS(primaryDataSource);
        return builder
                .dataSource(primaryDataSource)
                .properties(getVendorProperties())
                .packages("com.***.***.model.applet") //         
                .persistenceUnit("primaryPersistenceUnit")
                .build();
    }

    /**
     * jpa properties
     *
     * @return
     */
    private Map getVendorProperties() {
        Map ret = jpaProperties.getHibernateProperties(new HibernateSettings());
        ret.put("hibernate.dialect", "org.hibernate.dialect.MySQL5InnoDBDialect");
        return ret;
    }

    @Primary
    @Bean(name = "transactionManagerPrimary")
    public PlatformTransactionManager transactionManagerPrimary(EntityManagerFactoryBuilder builder) {
        return new JpaTransactionManager(entityManagerFactoryPrimary(builder).getObject());
    }
}

 
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.orm.jpa.HibernateSettings;
import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties;
import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;

import javax.persistence.EntityManager;
import javax.sql.DataSource;
import java.util.Map;

@Slf4j
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
        entityManagerFactoryRef = "entityManagerFactorySecondary",
        transactionManagerRef = "transactionManagerSecondary",
        basePackages = {"com.***.***.repository.master"}) //  Repository    
public class SecondaryConfig {

    @Autowired
    @Qualifier("secondaryDataSource")
    private DataSource secondaryDataSource;

    @Autowired
    private JpaProperties jpaProperties;

    @Bean(name = "entityManagerSecondary")
    public EntityManager entityManager(EntityManagerFactoryBuilder builder) {
        return entityManagerFactorySecondary(builder).getObject().createEntityManager();
    }

    @Bean(name = "entityManagerFactorySecondary")
    public LocalContainerEntityManagerFactoryBean entityManagerFactorySecondary(EntityManagerFactoryBuilder builder) {
        DataSourceConfig.logDS(secondaryDataSource);
        return builder
                .dataSource(secondaryDataSource)
                .properties(getVendorProperties())
                .packages("com.***.***.model.master") //         
                .persistenceUnit("secondaryPersistenceUnit")
                .build();
    }

    /**
     * jpa properties
     *
     * @return
     */
    private Map getVendorProperties() {
        Map ret = jpaProperties.getHibernateProperties(new HibernateSettings());
        ret.put("hibernate.dialect", "org.hibernate.dialect.MySQL5InnoDBDialect");
        return ret;
    }

    @Bean(name = "transactionManagerSecondary")
    PlatformTransactionManager transactionManagerSecondary(EntityManagerFactoryBuilder builder) {
        return new JpaTransactionManager(entityManagerFactorySecondary(builder).getObject());
    }
}

이로써 Spring Boot 2.0 구성 다중 데이터 소스가 완성되었습니다. 이 방법은 다른 데이터베이스 구성에도 적용되고 데이터 소스를 계속 추가할 수 있습니다. 응용 프로그램만 수정하거나 추가할 수 있습니다.properties의 데이터 원본 설정을 사용하면 됩니다.

좋은 웹페이지 즐겨찾기