spring boot多資料源配置
1.application.properties
spring.datasource.url = jdbc\:oracle\:thin\:@192.168.3.888\:1521\:orcl
spring.datasource.username =
spring.datasource.password =
spring.datasource.driverClassName = oracle.jdbc.driver.OracleDriver
spring.datasource.enp.url = jdbc\:oracle\:thin\:@192.168.3.888\:1521\:orcl
spring.datasource.enp.username = 8888
spring.datasource.enp.password = 8888
spring.datasource.enp.driverClassName = oracle.jdbc.driver.OracleDriver
spring.datasource.initialSize = 100
spring.datasource.maxActive = 130
spring.datasource.minIdle = 10
spring.datasource.maxIdle = 30
spring.datasource.maxWait = 5000
spring.datasource.testOnBorrow = true
spring.datasource.validationQuery = SELECT 1 FROM DUAL
spring.datasource.validationInterval = 10000
spring.datasource.timeBetweenEvictionRunsMillis = 5000
spring.datasource.minEvictableIdleTimeMillis = 5000
spring.datasource.removeAbandoned = true
spring.datasource.removeAbandonedTimeout = 60
spring.jpa.database = ORACLE
spring.jpa.show-sql = false
spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.ImprovedNamingStrategy
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.OracleDialect
2.DataSourceConfig.java—配置資料源
import java.sql.SQLException;
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import com.alibaba.druid.pool.DruidDataSource;
@Configuration
public class DataSourceConfig {
@Value("${spring.datasource.url}")
public String dbUrl;
@Value("${spring.datasource.username}")
public String dbUserName;
@Value("${spring.datasource.password}")
public String dbPassword;
@Value("${spring.datasource.driverClassName}")
public String driverClassName;
@Bean(name = "enpDataSource")
@Qualifier("enpDataSource")
@ConfigurationProperties(prefix="spring.datasource.enp")
public DataSource enpDataSource(){
return DataSourceBuilder.create().build();
}
@Primary
@Bean(name = "primaryDataSource")
@Qualifier("primaryDataSource")
// @ConfigurationProperties(prefix="spring.datasource")
public DataSource primaryDataSource(){
return createDataSource(driverClassName,dbUrl,dbUserName,dbPassword);
}
private DataSource createDataSource(String driverClassName, String url,
String username, String password) {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName(driverClassName);
dataSource.setUrl(url);
dataSource.setUsername(username);
dataSource.setPassword(password);
// 初始化大小,最小,最大
dataSource.setInitialSize(5);
dataSource.setMinIdle(5);
dataSource.setMaxActive(10);
// 配置擷取連接配接等待逾時的時間
dataSource.setMaxWait(60000);
// 配置間隔多久才進行一次檢測,檢測需要關閉的空閑連接配接,機關是毫秒
dataSource.setTimeBetweenEvictionRunsMillis(60000);
//配置一個連接配接在池中最小生存的時間,機關是毫秒
dataSource.setMinEvictableIdleTimeMillis(300000);
dataSource.setValidationQuery("select 1 from dual");
dataSource.setTestWhileIdle(true);
dataSource.setTestOnBorrow(false);
dataSource.setTestOnReturn(false);
// 打開PSCache,并且指定每個連接配接上PSCache的大小
dataSource.setPoolPreparedStatements(true);
dataSource.setMaxPoolPreparedStatementPerConnectionSize(10);
//配置監控統計攔截的filters,去掉後監控界面sql無法統計,'wall'用于防火牆
try {
dataSource.setFilters("stat,wall,log4j");
} catch (SQLException e) {
}
//通過connectProperties屬性來打開mergeSql功能;慢SQL記錄
dataSource.setConnectionProperties("=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000");
System.out.println(dataSource);
return dataSource;
}
}
3.PrimaryDbConfig.java—主資料源
import java.util.Map;
import javax.persistence.EntityManager;
import javax.sql.DataSource;
import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties;
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;
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
entityManagerFactoryRef="entityManagerFactoryPrimary",
transactionManagerRef="transactionManagerPrimary",
basePackages= { "com.boor" }) //設定Repository所在位置
public class PrimaryDbConfig {
@Autowired @Qualifier("primaryDataSource")
private DataSource primaryDataSource;
@Primary
@Bean(name = "entityManagerPrimary")
public EntityManager entityManager(EntityManagerFactoryBuilder builder) {
return entityManagerFactoryPrimary(builder).getObject().createEntityManager();
}
@Primary
@Bean(name = "entityManagerFactoryPrimary")
public LocalContainerEntityManagerFactoryBean entityManagerFactoryPrimary (EntityManagerFactoryBuilder builder) {
return builder.dataSource(primaryDataSource)
.properties(getVendorProperties(primaryDataSource))
.packages("com.boor.fdlss") //設定實體類所在位置
.persistenceUnit("primaryPersistenceUnit")
.build();
}
@Autowired
private JpaProperties jpaProperties;
private Map<String, String> getVendorProperties(DataSource dataSource) {
return jpaProperties.getHibernateProperties(dataSource);
}
@Primary
@Bean(name = "transactionManagerPrimary")
public PlatformTransactionManager transactionManagerPrimary(EntityManagerFactoryBuilder builder) {
return new JpaTransactionManager(entityManagerFactoryPrimary(builder).getObject());
}
}
3.EnpDbConfig.java—次資料源配置
package com.boor.config;
import java.util.Map;
import javax.persistence.EntityManager;
import javax.sql.DataSource;
import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties;
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;
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
entityManagerFactoryRef="entityManagerFactoryEnp",
transactionManagerRef="transactionManagerEnp",
basePackages= { "com.boor.enp" }) //設定Repository所在位置
public class EnpDbConfig {
@Autowired @Qualifier("enpDataSource")
private DataSource enpDataSource;
@Bean(name = "entityManagerEnp")
public EntityManager entityManager(EntityManagerFactoryBuilder builder) {
return entityManagerFactoryEnp(builder).getObject().createEntityManager();
}
@Bean(name = "entityManagerFactoryEnp")
public LocalContainerEntityManagerFactoryBean entityManagerFactoryEnp (EntityManagerFactoryBuilder builder) {
return builder.dataSource(enpDataSource)
.properties(getVendorProperties(enpDataSource))
.packages("com.boor.enp") //設定實體類所在位置
.persistenceUnit("enpPersistenceUnit")
.build();
}
@Autowired
private JpaProperties jpaProperties;
private Map<String, String> getVendorProperties(DataSource dataSource) {
return jpaProperties.getHibernateProperties(dataSource);
}
@Bean(name = "transactionManagerEnp")
public PlatformTransactionManager transactionManagerEnp(EntityManagerFactoryBuilder builder) {
return new JpaTransactionManager(entityManagerFactoryEnp(builder).getObject());
}
}