spring boot +spring data jpa +druid 多数据源配置

一、首先pom.xml新增如下依赖

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

		<!-- mysql驱动 -->
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
		</dependency>

		<!-- druid数据源 -->
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>druid</artifactId>
			<version>1.0.28</version>
		</dependency>

		<!-- spring-boot-starter-data-jpa包含spring-data-jpa、spring-orm 和 Hibernate来支持JPA -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-jpa</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>

		<dependency>
			<groupId>org.apache.commons</groupId>
			<artifactId>commons-lang3</artifactId>
			<version>3.4</version>
		</dependency>

	</dependencies>

二、配置文件内容如下:

server.port=8004

#####################################billsystem################################################################
spring.datasource.billsystem.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.billsystem.driverClassName = com.mysql.jdbc.Driver
spring.datasource.billsystem.url=jdbc:mysql://192.168.88.81:3306/bill_system?useUnicode=true&characterEncoding=utf-8&useSSL=false
spring.datasource.billsystem.username=acuser
spring.datasource.billsystem.password=rZN4JSSM4j5.2Q6GJaxCOzUOhwCccgMg
#初始化时建立物理连接的个数
spring.datasource.billsystem.druid.initialSize=5
#最小连接池数量
spring.datasource.billsystem.druid.minIdle=5
#最大连接池数量
spring.datasource.billsystem.druid.maxActive=20
#连接等待超时时间
spring.datasource.billsystem.druid.maxWait=60000
#配置隔多久进行一次检测(检测可以关闭的空闲连接)
spring.datasource.billsystem.druid.timeBetweenEvictionRunsMillis=60000
#配置连接在池中的最小生存时间
spring.datasource.billsystem.druid.minEvictableIdleTimeMillis=300000
#用来检测连接是否有效的sql
spring.datasource.billsystem.druid.validationQuery=SELECT 1 FROM sys_property
#申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能
spring.datasource.billsystem.druid.testOnBorrow=false
#归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能
spring.datasource.billsystem.druid.testOnReturn=false
#申请连接时检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效,建议配置
spring.datasource.billsystem.druid.testWhileIdle=true
#监控统计用的filter:stat;日志用的filter:log4j;防御sql注入的filter:wall
spring.datasource.billsystem.druid.filters=stat,wall,log4j
spring.datasource.billsystem.druid.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
spring.datasource.billsystem.druid.useGlobalDataSourceStat=true


#####################################nsradius################################################################
spring.datasource.nsradius.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.nsradius.driverClassName = com.mysql.jdbc.Driver
spring.datasource.nsradius.url=jdbc:mysql://192.168.88.81:3306/nsradius?useUnicode=true&characterEncoding=utf-8&useSSL=false
spring.datasource.nsradius.username=acuser
spring.datasource.nsradius.password=rZN4JSSM4j5.2Q6GJaxCOzUOhwCccgMg
#初始化时建立物理连接的个数
spring.datasource.nsradius.druid.initialSize=5
#最小连接池数量
spring.datasource.nsradius.druid.minIdle=5
#最大连接池数量
spring.datasource.nsradius.druid.maxActive=20
#连接等待超时时间
spring.datasource.nsradius.druid.maxWait=60000
#配置隔多久进行一次检测(检测可以关闭的空闲连接)
spring.datasource.nsradius.druid.timeBetweenEvictionRunsMillis=60000
#配置连接在池中的最小生存时间
spring.datasource.nsradius.druid.minEvictableIdleTimeMillis=300000
#用来检测连接是否有效的sql
spring.datasource.nsradius.druid.validationQuery=SELECT 1 FROM sys_property
#申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能
spring.datasource.nsradius.druid.testOnBorrow=false
#归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能
spring.datasource.nsradius.druid.testOnReturn=false
#申请连接时检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效,建议配置
spring.datasource.nsradius.druid.testWhileIdle=true
#监控统计用的filter:stat;日志用的filter:log4j;防御sql注入的filter:wall
spring.datasource.nsradius.druid.filters=stat,wall,log4j
spring.datasource.nsradius.druid.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
spring.datasource.nsradius.druid.useGlobalDataSourceStat=true

三、配置druid数据源

package com.ligowave.bill.common.config;

import com.alibaba.druid.pool.DruidDataSource;
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 javax.sql.DataSource;


@Configuration
public class DruidDataSourceConfig {
    @Bean(name = "billSystemDataSource")
    @Primary
    @ConfigurationProperties(prefix = "spring.datasource.billsystem")
    public DataSource billSystemDataSource(){
        return new DruidDataSource();
    }

    @Bean(name = "nsradiusDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.nsradius")
    public DataSource nsradiusDataSource(){
        return new DruidDataSource();
    }
}

四、分别配置两个数据源以及jpa

package com.ligowave.bill.common.config;

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.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.EntityManagerFactory;
import javax.sql.DataSource;
import java.util.Map;


@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
        entityManagerFactoryRef = "billSystemEntityManagerFactoryBean",
        transactionManagerRef = "billSystemTransactionManager",
        //设置Repository所在位置
        basePackages = {"com.ligowave.bill.domain.billsystem.repository"})
public class BillSystemDataSourceConfig {
    @Autowired
    private JpaProperties jpaProperties;

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

    @Bean(name = "billSystemEntityManagerFactoryBean")
    @Primary
    public LocalContainerEntityManagerFactoryBean billSystemEntityManagerFactoryBean(EntityManagerFactoryBuilder builder){
        return builder.dataSource(billSystemDataSource)
                .properties(getVendorProperties(billSystemDataSource))
                //设置实体类所在位置
                .packages("com.ligowave.bill.domain.billsystem.entity")
                .persistenceUnit("billSystemPersistenceUnit")
                .build();
    }

    private Map<String,String> getVendorProperties(DataSource dataSource){
        return jpaProperties.getHibernateProperties(dataSource);
    }

    /**
     * EntityManagerFactory类似于Hibernate的SessionFactory,mybatis的SqlSessionFactory
     * 总之,在执行操作之前,我们总要获取一个EntityManager,这就类似于Hibernate的Session,
     * mybatis的sqlSession.
     * @param builder
     * @return
     */
    @Bean(name = "billSystemEntityManagerFactory")
    public EntityManagerFactory billSystemEntityManagerFactory(EntityManagerFactoryBuilder builder){
        return this.billSystemEntityManagerFactoryBean(builder).getObject();
    }

    /**
     * 配置事物管理器
     */
    @Bean(name = "billSystemTransactionManager")
    public PlatformTransactionManager billSystemTransactionManager(EntityManagerFactoryBuilder builder){
        return new JpaTransactionManager(billSystemEntityManagerFactory(builder));
    }
}
package com.ligowave.bill.common.config;

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.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.EntityManagerFactory;
import javax.sql.DataSource;
import java.util.Map;

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
        entityManagerFactoryRef = "nsradiusEntityManagerFactoryBean",
        transactionManagerRef = "nsradiusTransactionManager",
        //设置Repository所在位置
        basePackages = {"com.ligowave.bill.domain.nsradius.repository"})
public class NsradiusDataSourceConfig {
    @Autowired
    private JpaProperties jpaProperties;

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

    @Bean(name = "nsradiusEntityManagerFactoryBean")
    public LocalContainerEntityManagerFactoryBean nsradiusEntityManagerFactoryBean(EntityManagerFactoryBuilder builder){
        return builder.dataSource(nsradiusDataSource)
                .properties(getVendorProperties(nsradiusDataSource))
                //设置实体类所在位置
                .packages("com.ligowave.bill.domain.nsradius.entity")
                .persistenceUnit("nsradiusPersistenceUnit")
                .build();
    }

    private Map<String,String> getVendorProperties(DataSource dataSource){
        return jpaProperties.getHibernateProperties(dataSource);
    }

    /**
     * EntityManagerFactory类似于Hibernate的SessionFactory,mybatis的SqlSessionFactory
     * 总之,在执行操作之前,我们总要获取一个EntityManager,这就类似于Hibernate的Session,
     * mybatis的sqlSession.
     */
    @Bean(name = "nsradiusEntityManagerFactory")
    public EntityManagerFactory nsradiusEntityManagerFactory(EntityManagerFactoryBuilder builder){
        return this.nsradiusEntityManagerFactoryBean(builder).getObject();
    }

    /**
     * 配置事物管理器
     */
    @Bean(name = "nsradiusTransactionManager")
    public PlatformTransactionManager nsradiusTransactionManager(EntityManagerFactoryBuilder builder){
        return new JpaTransactionManager(nsradiusEntityManagerFactory(builder));
    }
}

猜你喜欢

转载自my.oschina.net/u/3316877/blog/1604716