Contents

开始

项目开发中存在不止一个数据库的情况,需要用到多数据源配置,进行相关业务开发。

实现方式

使用方式与单个druid配置相同

pom

1 <dependency>
2    <groupId>com.alibaba</groupId>
3    <artifactId>druid-spring-boot-starter</artifactId>
4    <version>1.1.14</version>
5</dependency>

配置文件

application配置

 1#第一个数据配置
 2spring.datasource.username=root
 3spring.datasource.password=root
 4spring.datasource.driver-class-name=com.mysql.jdbc.Driver
 5spring.datasource.url=jdbc:mysql://localhost:3306/test?characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
 6
 7# 连接池指定 springboot版本默认使用HikariCP 此处要替换成Druid
 8spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
 9
10## 初始化连接池的连接数量 大小,最小,最大
11spring.datasource.druid.initial-size=1
12spring.datasource.druid.min-idle=1
13spring.datasource.druid.max-active=20
14## 配置获取连接等待超时的时间
15spring.datasource.druid.max-wait=60000
16# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
17spring.datasource.druid.time-between-eviction-runs-millis=60000
18# 配置一个连接在池中最小生存的时间,单位是毫秒
19spring.datasource.druid.min-evictable-idle-time-millis=300000
20spring.datasource.druid.validation-query=SELECT 'x'
21spring.datasource.druid.test-on-borrow=false
22spring.datasource.druid.test-on-return=false
23spring.datasource.druid.filter.stat.log-slow-sql=true
24# 是否缓存preparedStatement,也就是PSCache  官方建议MySQL下建议关闭   个人建议如果想用SQL防火墙 建议打开
25spring.datasource.druid.pool-prepared-statements=false
26spring.datasource.druid.max-pool-prepared-statement-per-connection-size=20
27# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
28spring.datasource.druid.filters=stat,wall
29spring.datasource.druid.test-while-idle=true
30#Spring监控,对内部各接口调用的监控
31spring.datasource.druid.aop-patterns=com.felix.project.controller.*,com.felix.project.mapper.*,com.felix.project.service.*
32
33# 第二个数据库配置
34spring.datasource.felix.username=root
35spring.datasource.felix.password=root
36spring.datasource.felix.driver-class-name=com.mysql.jdbc.Driver
37spring.datasource.felix.url=jdbc:mysql://localhost:3306/test1?characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
38# 连接池指定 springboot版本默认使用HikariCP 此处要替换成Druid
39spring.datasource.felix.type=com.alibaba.druid.pool.DruidDataSource
40## 初始化连接池的连接数量 大小,最小,最大
41spring.datasource.felix.druid.initial-size=1
42spring.datasource.felix.druid.min-idle=1
43spring.datasource.felix.druid.max-active=20
44## 配置获取连接等待超时的时间
45spring.datasource.felix.druid.max-wait=60000
46# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
47spring.datasource.felix.druid.time-between-eviction-runs-millis=60000
48# 配置一个连接在池中最小生存的时间,单位是毫秒
49spring.datasource.felix.druid.min-evictable-idle-time-millis=300000
50spring.datasource.felix.druid.validation-query=SELECT 'x'
51spring.datasource.felix.druid.test-on-borrow=false
52spring.datasource.felix.druid.test-on-return=false
53spring.datasource.felix.druid.filter.stat.log-slow-sql=true
54# 是否缓存preparedStatement,也就是PSCache  官方建议MySQL下建议关闭   个人建议如果想用SQL防火墙 建议打开
55spring.datasource.felix.druid.pool-prepared-statements=false
56spring.datasource.felix.druid.max-pool-prepared-statement-per-connection-size=20
57# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
58spring.datasource.felix.druid.filters=stat,wall
59spring.datasource.felix.druid.test-while-idle=true
60#Spring监控,对内部各接口调用的监控
61spring.datasource.felix.druid.aop-patterns=com.felix.project.controller.*,com.felix.project.mapper.*,com.felix.project.service.*
62
63
64mybatis.mapper-locations=classpath:mapper/*.xml,classpath:mapper2/*.xml
65mybatis.type-aliases-package=com.felix.project.model
66mapper.not-empty=false
67mapper.identity=MYSQL
68

yml 配置文件相类似

第一个config类

新建两个druid配置,采用手动配置的方式,避免druid不能监控到SQL
第一个配置文件

  1import com.alibaba.druid.pool.DruidDataSource;
  2import org.apache.ibatis.session.SqlSessionFactory;
  3import org.mybatis.spring.SqlSessionFactoryBean;
  4import org.springframework.beans.factory.annotation.Qualifier;
  5import org.springframework.beans.factory.annotation.Value;
  6import org.springframework.context.annotation.Bean;
  7import org.springframework.context.annotation.Configuration;
  8import org.springframework.context.annotation.Primary;
  9import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
 10import org.springframework.jdbc.datasource.DataSourceTransactionManager;
 11import tk.mybatis.spring.annotation.MapperScan;
 12
 13import javax.sql.DataSource;
 14import java.sql.SQLException;
 15
 16@Configuration
 17@MapperScan(basePackages ="com.felix.project.mapper", sqlSessionFactoryRef = "masterSqlSessionFactory")
 18public class DruidConfig {
 19
 20    @Value("${spring.datasource.url}")
 21    private String url;
 22    @Value("${spring.datasource.username}")
 23    private String username;
 24    @Value("${spring.datasource.password}")
 25    private String password;
 26    @Value("${spring.datasource.driver-class-name}")
 27    private String driverClassName;
 28    @Value("${spring.datasource.druid.initial-size}")
 29    private int initialSize;
 30    @Value("${spring.datasource.druid.min-idle}")
 31    private int minIdle;
 32    @Value("${spring.datasource.druid.max-active}")
 33    private int maxActive;
 34    @Value("${spring.datasource.druid.max-wait}")
 35    private int maxWait;
 36    @Value("${spring.datasource.druid.time-between-eviction-runs-millis}")
 37    private int timeBetweenEvictionRunsMillis;
 38    @Value("${spring.datasource.druid.min-evictable-idle-time-millis}")
 39    private int minEvictableIdleTimeMillis;
 40    @Value("${spring.datasource.druid.validation-query}")
 41    private String validationQuery;
 42    @Value("${spring.datasource.druid.test-while-idle}")
 43    private boolean testWhileIdle;
 44    @Value("${spring.datasource.druid.test-on-borrow}")
 45    private boolean testOnBorrow;
 46    @Value("${spring.datasource.druid.test-on-return}")
 47    private boolean testOnReturn;
 48    @Value("${spring.datasource.druid.pool-prepared-statements}")
 49    private boolean poolPreparedStatements;
 50    @Value("${spring.datasource.druid.max-pool-prepared-statement-per-connection-size}")
 51    private int maxPoolPreparedStatementPerConnectionSize;
 52    @Value("${spring.datasource.druid.filters}")
 53    private String filters;
 54    @Value("${spring.datasource.druid.aop-patterns}")
 55    private String[] aopPatterns;
 56    /**
 57     * 创建数据源
 58     *
 59     * @return DataSource
 60     */
 61    @Bean(name = "masterDataSource")
 62    @Primary
 63    public DataSource masterDataSource() {
 64        DruidDataSource datasource = new DruidDataSource();
 65        datasource.setUrl(url);
 66        datasource.setUsername(username);
 67        datasource.setPassword(password);
 68        datasource.setDriverClassName(driverClassName);
 69        datasource.setInitialSize(initialSize);
 70        datasource.setMinIdle(minIdle);
 71        datasource.setMaxActive(maxActive);
 72        datasource.setMaxWait(maxWait);
 73        datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
 74        datasource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
 75        datasource.setValidationQuery(validationQuery);
 76        datasource.setTestWhileIdle(testWhileIdle);
 77        datasource.setTestOnBorrow(testOnBorrow);
 78        datasource.setTestOnReturn(testOnReturn);
 79        datasource.setPoolPreparedStatements(poolPreparedStatements);
 80        try {
 81            datasource.setFilters(filters);
 82        } catch (SQLException e) {
 83            e.printStackTrace();
 84        }
 85        return datasource;
 86    }
 87
 88    // 创建该数据源的事务管理
 89    @Primary
 90    @Bean(name = "primaryTransactionManager")
 91    public DataSourceTransactionManager primaryTransactionManager() throws SQLException {
 92        return new DataSourceTransactionManager(masterDataSource());
 93    }
 94
 95    // 创建Mybatis的连接会话工厂实例
 96    @Primary
 97    @Bean(name = "masterSqlSessionFactory")
 98    public SqlSessionFactory primarySqlSessionFactory(@Qualifier("masterDataSource") DataSource primaryDataSource) throws Exception {
 99        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
100        sessionFactory.setDataSource(primaryDataSource);  // 设置数据源bean
101        sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
102                .getResources("classpath:mapper/*.xml"));  // 设置mapper文件路径
103        return sessionFactory.getObject();
104    }
105}

第二config类

  1package com.felix.project.config;
  2
  3import com.alibaba.druid.pool.DruidDataSource;
  4import org.apache.ibatis.session.SqlSessionFactory;
  5import org.mybatis.spring.SqlSessionFactoryBean;
  6import org.springframework.beans.factory.annotation.Qualifier;
  7import org.springframework.beans.factory.annotation.Value;
  8import org.springframework.context.annotation.Bean;
  9import org.springframework.context.annotation.Configuration;
 10import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
 11import org.springframework.jdbc.datasource.DataSourceTransactionManager;
 12import tk.mybatis.spring.annotation.MapperScan;
 13
 14import javax.sql.DataSource;
 15import java.sql.SQLException;
 16
 17@Configuration
 18@MapperScan(basePackages ="com.felix.project.mapper2",sqlSessionFactoryRef = "secondSqlSessionFactory")
 19public class DruidFelicConfig {
 20
 21    @Value("${spring.datasource.felix.url}")
 22    private String url;
 23    @Value("${spring.datasource.felix.username}")
 24    private String username;
 25    @Value("${spring.datasource.felix.password}")
 26    private String password;
 27    @Value("${spring.datasource.felix.driver-class-name}")
 28    private String driverClassName;
 29    @Value("${spring.datasource.felix.druid.initial-size}")
 30    private int initialSize;
 31    @Value("${spring.datasource.felix.druid.min-idle}")
 32    private int minIdle;
 33    @Value("${spring.datasource.felix.druid.max-active}")
 34    private int maxActive;
 35    @Value("${spring.datasource.felix.druid.max-wait}")
 36    private int maxWait;
 37    @Value("${spring.datasource.felix.druid.time-between-eviction-runs-millis}")
 38    private int timeBetweenEvictionRunsMillis;
 39    @Value("${spring.datasource.felix.druid.min-evictable-idle-time-millis}")
 40    private int minEvictableIdleTimeMillis;
 41    @Value("${spring.datasource.felix.druid.validation-query}")
 42    private String validationQuery;
 43    @Value("${spring.datasource.felix.druid.test-while-idle}")
 44    private boolean testWhileIdle;
 45    @Value("${spring.datasource.felix.druid.test-on-borrow}")
 46    private boolean testOnBorrow;
 47    @Value("${spring.datasource.felix.druid.test-on-return}")
 48    private boolean testOnReturn;
 49    @Value("${spring.datasource.felix.druid.pool-prepared-statements}")
 50    private boolean poolPreparedStatements;
 51    @Value("${spring.datasource.felix.druid.max-pool-prepared-statement-per-connection-size}")
 52    private int maxPoolPreparedStatementPerConnectionSize;
 53    @Value("${spring.datasource.felix.druid.filters}")
 54    private String filters;
 55    @Value("${spring.datasource.felix.druid.aop-patterns}")
 56    private String[] aopPatterns;
 57
 58    /**
 59     *  DataSource
 60     * @return
 61     */
 62    @Bean(name = "secondDataSource")
 63    public DataSource secondDataSource() {
 64        DruidDataSource datasource = new DruidDataSource();
 65        datasource.setUrl(url);
 66        datasource.setUsername(username);
 67        datasource.setPassword(password);
 68        datasource.setDriverClassName(driverClassName);
 69        datasource.setInitialSize(initialSize);
 70        datasource.setMinIdle(minIdle);
 71        datasource.setMaxActive(maxActive);
 72        datasource.setMaxWait(maxWait);
 73        datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
 74        datasource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
 75        datasource.setValidationQuery(validationQuery);
 76        datasource.setTestWhileIdle(testWhileIdle);
 77        datasource.setTestOnBorrow(testOnBorrow);
 78        datasource.setTestOnReturn(testOnReturn);
 79        datasource.setPoolPreparedStatements(poolPreparedStatements);
 80        try {
 81            datasource.setFilters(filters);
 82        } catch (SQLException e) {
 83            e.printStackTrace();
 84        }
 85        return datasource;
 86    }
 87
 88    // 创建该数据源的事务管理
 89    @Bean(name = "secondTransactionManager")
 90    public DataSourceTransactionManager secondTransactionManager() throws SQLException {
 91        return new DataSourceTransactionManager(secondDataSource());
 92    }
 93
 94    // 创建Mybatis的连接会话工厂实例
 95    @Bean(name = "secondSqlSessionFactory")
 96    public SqlSessionFactory secondSqlSessionFactory(@Qualifier("secondDataSource") DataSource primaryDataSource) throws Exception {
 97        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
 98        sessionFactory.setDataSource(primaryDataSource);  // 设置数据源bean
 99        sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
100                .getResources("classpath:mapper/*.xml"));  // 设置mapper文件路径
101        return sessionFactory.getObject();
102    }
103}

两配置文件基本相同,主要区别在与主配置需要加上@Primary注解

监控

新建一个DruidMoniterConfig配置项用于开启druid监控

 1package com.felix.project.config;
 2
 3import com.alibaba.druid.support.http.StatViewServlet;
 4import com.alibaba.druid.support.http.WebStatFilter;
 5import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
 6import org.springframework.boot.web.servlet.FilterRegistrationBean;
 7import org.springframework.boot.web.servlet.ServletRegistrationBean;
 8import org.springframework.context.annotation.Bean;
 9import org.springframework.context.annotation.Configuration;
10
11@Configuration
12public class DruidMoniterConfig {
13    @Bean
14    @ConditionalOnMissingBean
15    public ServletRegistrationBean druidServlet() {
16        ServletRegistrationBean servletRegistrationBean =
17                new ServletRegistrationBean(new StatViewServlet(), "/druid/*");
18        //白名单
19        // servletRegistrationBean.addInitParameter("allow","192.168.6.195");
20        //IP黑名单(存在共同时,deny优先于allow) : 如果满足deny的话提示:Sorry, you are not permitted to view this page.
21        //  servletRegistrationBean.addInitParameter("deny","192.168.6.73");
22        //用于登陆的账号密码
23        servletRegistrationBean.addInitParameter("loginUsername", "admin");
24        servletRegistrationBean.addInitParameter("loginPassword", "admin");
25        //是否能重置数据
26        servletRegistrationBean.addInitParameter("resetEnable", "false");
27        return servletRegistrationBean;
28    }
29
30    @Bean
31    @ConditionalOnMissingBean
32    public FilterRegistrationBean filterRegistrationBean() {
33        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new WebStatFilter());
34        //添加过滤规则.
35        filterRegistrationBean.addUrlPatterns("/*");
36        //添加不需要忽略的格式信息.
37        filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
38        return filterRegistrationBean;
39    }
40
41}

登录

druid

druid
druid

查询数据库验证

druid

参考

https://www.cnblogs.com/qdhxhz/p/10192041.html