天天看點

spring boot多資料源配置示例spring boot多資料源配置

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());
    }

}
           

繼續閱讀