springboot多数据源和配置druid连接池


多数据源

1、pom



   com.alibaba
   druid-spring-boot-starter
   1.1.17

2、配置文件

spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/mytest?serverTimezone=UTC&useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF8
    password: root
    username: root
    
    filters: stat
    maxActive: 20
    initialSize: 1
    maxWait: 60000
    minIdle: 10
    #maxIdle:15

    timeBetweenEvictionRunsMillis: 60000
    minEvictableIdleTimeMillis: 320000

    validationQuery: SELECT 'x'
    testWhileIdle: true
    testOnBorrow: false
    testOnReturn: false
    #poolPreparedStatements:true
    maxOpenPreparedStatements: 20

 3、配置类

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 javax.sql.DataSource;

// druid配置类,读取spring.datasource的相关配置
@Configuration
public class DruidConfig {

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


参数说明:

- spring.datasource.druid.max-active  最大连接数 
- spring.datasource.druid.initial-size  初始化大小 
- spring.datasource.druid.min-idle  最小连接数 
- spring.datasource.druid.max-wait  获取连接等待超时时间 
- spring.datasource.druid.time-between-eviction-runs-millis  间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 
- spring.datasource.druid.min-evictable-idle-time-millis  一个连接在池中最小生存的时间,单位是毫秒 
- spring.datasource.druid.filters=config,stat,wall,log4j  配置监控统计拦截的filters,去掉后监控界面SQL无法进行统计,’wall’用于防火墙

多数据源

1、配置文件,增加 db2 数据源

查看代码
spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/mytest?serverTimezone=UTC&useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF8
    password: root
    username: root
    filters: stat
    maxActive: 20
    initialSize: 1
    maxWait: 60000
    minIdle: 10
    #maxIdle:15

    timeBetweenEvictionRunsMillis: 60000
    minEvictableIdleTimeMillis: 320000

    validationQuery: SELECT 'x'
    testWhileIdle: true
    testOnBorrow: false
    testOnReturn: false
    #poolPreparedStatements:true
    maxOpenPreparedStatements: 20

    db2:
      driver-class-name: com.mysql.jdbc.Driver
      url: jdbc:mysql://localhost:3306/demo?serverTimezone=UTC&useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF8
      password: root
      username: root
      filters: stat
      maxActive: 20
      initialSize: 1
      maxWait: 60000
      minIdle: 10
      #maxIdle:15

      timeBetweenEvictionRunsMillis: 60000
      minEvictableIdleTimeMillis: 320000

      validationQuery: SELECT 'x'
      testWhileIdle: true
      testOnBorrow: false
      testOnReturn: false
      #poolPreparedStatements:true
      maxOpenPreparedStatements: 20

2、两个数据源配置类

主数据源配置类:

import com.alibaba.druid.pool.DruidDataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.springframework.beans.factory.annotation.Qualifier;
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 org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import javax.sql.DataSource;

@Configuration
public class DruidConfig {

    // 读取配置文件中的 spring.datasource配置
    // 配置多数据源时要默认一个数据源,所以要加 @Primary
    @ConfigurationProperties(prefix = "spring.datasource")
    @Bean(name = "dataSource")
    @Primary
    public DataSource dataSource() {
        return new DruidDataSource();
    }

    @Bean(name = "masterTransactionManager")
    @Primary
    public DataSourceTransactionManager masterTransactionManager() {
        return new DataSourceTransactionManager(dataSource());
    }

    @Bean(name = "masterSqlSessionFactory")
    @Primary
    public SqlSessionFactory masterSqlSessionFactory(@Qualifier("dataSource") DataSource masterDataSource)
            throws Exception {
        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(masterDataSource);
        sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
                .getResources("classpath*:mapper/**/*.xml"));   // 对应的mapper.xml
        sessionFactory.setTypeAliasesPackage("com.xxx.**.domain");          // 对应的实体类,可写可不写
        //mybatis 数据库字段与实体类属性驼峰映射配置
        sessionFactory.getObject().getConfiguration().setMapUnderscoreToCamelCase(true);
        return sessionFactory.getObject();
    }
        
    @Bean(name = "jdbcTemplate1")
    @Primary
    public JdbcTemplate jdbcTemplate1() {
        return new JdbcTemplate(dataSource());
    }
}

 第二个数据源配置类:

import com.alibaba.druid.pool.DruidDataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import javax.sql.DataSource;

@Configuration
public class DruidConfig2 {

    // 读取配置文件中,spring.datasource.db2 的数据源配置,返加datasource对象
    @ConfigurationProperties(prefix = "spring.datasource.db2")
    @Bean(name = "dataSource2")
    public DataSource dataSource2() {
        return new DruidDataSource();
    }

    @Bean(name = "clusterTransactionManager")
    public DataSourceTransactionManager clusterTransactionManager() {
        return new DataSourceTransactionManager(dataSource2());
    }

    @Bean(name = "clusterSqlSessionFactory")
    public SqlSessionFactory clusterSqlSessionFactory(@Qualifier("dataSource2") DataSource masterDataSource)
            throws Exception {
        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(masterDataSource);
        sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
                .getResources("classpath*:mapper/**/*.xml"));
        sessionFactory.setTypeAliasesPackage("com.subject.xxx.domain");
        //mybatis 数据库字段与实体类属性驼峰映射配置
        sessionFactory.getObject().getConfiguration().setMapUnderscoreToCamelCase(true);
        return sessionFactory.getObject();
    }
        
    @Bean(name = "jdbcTemplate2")
    public JdbcTemplate jdbcTemplate2() {
        return new JdbcTemplate(dataSource2());
    }
}

以上两个类主要区别是:是否加@Primary注解,读取配置前缀不同,bean的name不一样。

3、修改main方法上mapper接口扫描路径,将对应的mapper接口交给相应的数据源 sqlSessionFactoryRef

@MapperScan(basePackages = {"com.subject.mapper"},sqlSessionFactoryRef = "masterSqlSessionFactory")
@MapperScan(basePackages = {"com.subject.mapper2"},sqlSessionFactoryRef = "clusterSqlSessionFactory")

 在包 com.subject.mapper 下的所有mapper接口都走 masterSqlSessionFactory下的数据源。

 在包 com.subject.mapper2 下的所有mapper接口都走 clusterSqlSessionFactory下的数据源。

注:masterSqlSessionFactory、clusterSqlSessionFactory就是第2步配置类中对应 Factory的bean的name。

druid监控页面

在任一配置类加入以下方法,并访问 http://127.0.0.1:xxxx/druid/index.html

/**
     *  实现WEB监控的配置处理
     *  http://127.0.0.1:xxxx/druid/index.html
     */
    @Bean
    public ServletRegistrationBean druidServlet() {
        // 现在要进行druid监控的配置处理操作
        ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(
                new StatViewServlet(), "/druid/*");
        // 白名单,多个用逗号分割, 如果allow没有配置或者为空,则允许所有访问
        servletRegistrationBean.addInitParameter("allow", "127.0.0.1");
        // 黑名单,多个用逗号分割 (共同存在时,deny优先于allow)
        servletRegistrationBean.addInitParameter("deny", "192.168.1.110");
        // 控制台管理用户名
        servletRegistrationBean.addInitParameter("loginUsername", "root");
        // 控制台管理密码
        servletRegistrationBean.addInitParameter("loginPassword", "root");
        // 是否可以重置数据源,禁用HTML页面上的“Reset All”功能
        servletRegistrationBean.addInitParameter("resetEnable", "false");
        return servletRegistrationBean ;
    }

    @Bean
    public FilterRegistrationBean filterRegistrationBean() {
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean() ;
        filterRegistrationBean.setFilter(new WebStatFilter());
        //所有请求进行监控处理
        filterRegistrationBean.addUrlPatterns("/*");
        //添加不需要忽略的格式信息
        filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.css,/druid/*");
        return filterRegistrationBean ;
    }

以上只是以两个数据源为例,如果有多个,就建多个类

相关