Spring Boot 2.0.X 다중 데이터 소스 및 연결 풀 구성
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의 데이터 원본 설정을 사용하면 됩니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.