随手记-Spring Boot2.0配置Druid数据库连接池(单数据源、多数据源、数据监控)

转载记录,后续实践再更新

 

开发环境是:IDEA(2017),JDK(1.8),Maven(3.3.9),SpringBoot(使用的是2.0.3版本,详细创建过程可以参考:https://blog.csdn.net/qq_38455201/article/details/80742205)

一:单数据源的配置以及数据监控
第一步:导入maven依赖




    com.alibaba
    druid
    1.1.10



    com.alibaba
    druid-spring-boot-starter
    1.1.9



    mysql
    mysql-connector-java
    5.1.21


    tk.mybatis
    mapper-spring-boot-starter
    1.1.4

第二步:在application.properties文件当中引入以下配置

##################    JDBC 配置    ################
#数据库配置
spring.datasource.druid.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.druid.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.druid.url=jdbc:mysql://localhost:3306/springboot?useSSL=false&useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true
spring.datasource.druid.username=root
spring.datasource.druid.password=123456
##################    连接池配置    ################
#连接池建立时创建的初始化连接数
spring.datasource.druid.initial-size=5
#连接池中最大的活跃连接数
spring.datasource.druid.max-active=20
#连接池中最小的活跃连接数
spring.datasource.druid.min-idle=5
# 配置获取连接等待超时的时间
spring.datasource.druid.max-wait=60000
# 打开PSCache,并且指定每个连接上PSCache的大小
spring.datasource.druid.pool-prepared-statements=true
spring.datasource.druid.max-pool-prepared-statement-per-connection-size=20
#spring.datasource.druid.max-open-prepared-statements= #和上面的等价
spring.datasource.druid.validation-query=SELECT 1 FROM DUAL
spring.datasource.druid.validation-query-timeout=30000
#是否在获得连接后检测其可用性
spring.datasource.druid.test-on-borrow=false
#是否在连接放回连接池后检测其可用性
spring.datasource.druid.test-on-return=false
#是否在连接空闲一段时间后检测其可用性
spring.datasource.druid.test-while-idle=true
#spring.datasource.druid.time-between-eviction-runs-millis=
#spring.datasource.druid.min-evictable-idle-time-millis=
#spring.datasource.druid.max-evictable-idle-time-millis=
##########################  mybatis   ##########################
#mapper.xml文件放置的位置
mybatis.mapper-locations=classpath:mapper/*.xml
第三步:编写DruidConfig.java类,进行初始化配置和监控配置(SpringBoot本来是集成了自动配置的,但是我这里就是不起效果,所以我只能自己手动的去配置了,不知道其他人会出现什么效果)

@Configuration
//自动扫描你的Dao包里面的Dao接口,我在这里使用的是mybatis操作数据库
@MapperScan("com.xxx.xxx.xxx")
public class DruidConfig {
 
    //非常简单的配置druid数据库连接池
    @ConfigurationProperties(prefix = "spring.datasource.druid")
    @Bean
    public DataSource druid(){
        return  new DruidDataSource();
    }
 
    //下面的1和2是配置Druid的监控
    //1、配置一个管理后台的Servlet
    @Bean
    public ServletRegistrationBean statViewServlet(){
        ServletRegistrationBean bean = new ServletRegistrationBean(new StatViewServlet(), "/druid/*");
        Map initParams = new HashMap<>();
        initParams.put("loginUsername","admin");//登录druid监控的账户
        initParams.put("loginPassword","admin");//登录druid监控的密码
        initParams.put("allow","");//默认就是允许所有访问
        initParams.put("deny","192.168.15.21");//黑名单的IP
 
        bean.setInitParameters(initParams);
        return bean;
    }
    //2、配置一个web监控的filter
    @Bean
    public FilterRegistrationBean webStatFilter(){
        FilterRegistrationBean bean = new FilterRegistrationBean();
        bean.setFilter(new WebStatFilter());
 
        Map initParams = new HashMap<>();
        initParams.put("exclusions","*.js,*.css,/druid/*");
 
        bean.setInitParameters(initParams);
 
        bean.setUrlPatterns(Arrays.asList("/*"));
 
        return  bean;
    }
}
现在我们打开http://localhost:8018/druid/login.html,用我们配置的druid监控的账号和密码进行登录,就可以看到监控的信息,发现我们配置的都已经生效了。

二:多数据源的配置以及监控
第一步:和单数据源一样的maven依赖

第二步:application.properties当中的配置信息

##########################  mysql   ##########################
#数据库配置
spring.datasource.druid.master.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.druid.master.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.druid.master.url=jdbc:mysql://localhost:3306/springboot?useSSL=false&useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true
spring.datasource.druid.master.username=root
spring.datasource.druid.master.password=123456
##########################  druid配置   ##########################
# 下面为连接池的补充设置,应用到上面所有数据源中# 初始化大小,最小,最大
##################    连接池配置    ################
#连接池建立时创建的初始化连接数
spring.datasource.druid.master.initial-size=5
#连接池中最大的活跃连接数
spring.datasource.druid.master.max-active=20
#连接池中最小的活跃连接数
spring.datasource.druid.master.min-idle=5
# 配置获取连接等待超时的时间
spring.datasource.druid.master.max-wait=60000
# 打开PSCache,并且指定每个连接上PSCache的大小
spring.datasource.druid.master.pool-prepared-statements=true
spring.datasource.druid.master.max-pool-prepared-statement-per-connection-size=20
#spring.datasource.druid.max-open-prepared-statements= #和上面的等价
spring.datasource.druid.master.validation-query=SELECT 1 FROM DUAL
spring.datasource.druid.master.validation-query-timeout=30000
#是否在获得连接后检测其可用性
spring.datasource.druid.master.test-on-borrow=false
#是否在连接放回连接池后检测其可用性
spring.datasource.druid.master.test-on-return=false
#是否在连接空闲一段时间后检测其可用性
spring.datasource.druid.master.test-while-idle=true
 
 
##########################  mybatis   ##########################
#mapper.xml文件放置的位置
mybatis.mapper-locations=classpath:mapper/*.xml
 
 
##########################  mysql   ##########################
#数据库配置
spring.datasource.druid.slave.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.druid.slave.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.druid.slave.url=jdbc:mysql://localhost:3306/mybatis?useSSL=false&useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true
spring.datasource.druid.slave.username=root
spring.datasource.druid.slave.password=123456
##########################  druid配置   ##########################
# 下面为连接池的补充设置,应用到上面所有数据源中# 初始化大小,最小,最大
##################    连接池配置    ################
#连接池建立时创建的初始化连接数
spring.datasource.druid.slave.initial-size=5
#连接池中最大的活跃连接数
spring.datasource.druid.slave.max-active=20
#连接池中最小的活跃连接数
spring.datasource.druid.slave.min-idle=5
# 配置获取连接等待超时的时间
spring.datasource.druid.slave.max-wait=60000
# 打开PSCache,并且指定每个连接上PSCache的大小
spring.datasource.druid.slave.pool-prepared-statements=true
spring.datasource.druid.slave.max-pool-prepared-statement-per-connection-size=20
#spring.datasource.druid.max-open-prepared-statements= #和上面的等价
spring.datasource.druid.slave.validation-query=SELECT 1 FROM DUAL
spring.datasource.druid.slave.validation-query-timeout=30000
#是否在获得连接后检测其可用性
spring.datasource.druid.slave.test-on-borrow=false
#是否在连接放回连接池后检测其可用性
spring.datasource.druid.slave.test-on-return=false
#是否在连接空闲一段时间后检测其可用性
spring.datasource.druid.slave.test-while-idle=true
第三步:非常重要的两个数据连接池的java配置文件

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidDataSourceMBean;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
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
@MapperScan(basePackages = "com.learning.four.dao.master", sqlSessionTemplateRef  = "masterSqlSessionTemplate")
public class MasterDataSourceConfiguration {
 
    @Bean(name = "masterDataSource")
    //下面这个注解控制哪个实例优先被注入,我们放在第一个数据源上面
    @Primary
    @ConfigurationProperties(prefix = "spring.datasource.druid.master")
    public DataSource dataSource() {
        return  new DruidDataSource();
    }
 
    @Bean(name = "masterSqlSessionFactory")
    @Primary
    public SqlSessionFactory sqlSessionFactory(@Qualifier("masterDataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/*.xml"));
        return bean.getObject();
    }
 
    @Bean(name = "masterTransactionManager")
    @Primary
    public DataSourceTransactionManager transactionManager(@Qualifier("masterDataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }
 
    @Bean(name = "masterSqlSessionTemplate")
    @Primary
    public SqlSessionTemplate sqlSessionTemplate(@Qualifier("masterSqlSessionFactory") SqlSessionFactory sqlSessionFactory)
            throws Exception {
        return new SqlSessionTemplate(sqlSessionFactory);
    }
 
}
import com.alibaba.druid.pool.DruidDataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
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
@MapperScan(basePackages = "com.learning.four.dao.slave", sqlSessionTemplateRef  = "slaveSqlSessionTemplate")
public class SlaverDataSourceConfiguration {
 
    @Bean(name = "slaveDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.druid.slave")
    public DataSource dataSource() {
        return  new DruidDataSource();
    }
 
    @Bean(name = "slaveSqlSessionFactory")
    @Primary
    public SqlSessionFactory sqlSessionFactory(@Qualifier("slaveDataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/*.xml"));
        return bean.getObject();
    }
 
    @Bean(name = "slaveTransactionManager")
    @Primary
    public DataSourceTransactionManager transactionManager(@Qualifier("slaveDataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }
 
    @Bean(name = "slaveSqlSessionTemplate")
    @Primary
    public SqlSessionTemplate sqlSessionTemplate(@Qualifier("slaveSqlSessionFactory") SqlSessionFactory sqlSessionFactory)
            throws Exception {
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}
单独一个配置文件,配置druid的监控

import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
 
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
 
//Druid监控配置
@Configuration
public class DruidMoniterConfig
{
    //1、配置一个管理后台的Servlet
    @Bean
    public ServletRegistrationBean statViewServlet(){
        ServletRegistrationBean bean = new ServletRegistrationBean(new StatViewServlet(), "/druid/*");
        Map initParams = new HashMap<>();
        initParams.put("loginUsername","admin");
        initParams.put("loginPassword","admin");
        initParams.put("allow","");//默认就是允许所有访问
        initParams.put("deny","192.168.15.21");//黑名单的IP
 
        bean.setInitParameters(initParams);
        return bean;
    }
 
    //2、配置一个web监控的filter
    @Bean
    public FilterRegistrationBean webStatFilter(){
        FilterRegistrationBean bean = new FilterRegistrationBean();
        bean.setFilter(new WebStatFilter());
 
        Map initParams = new HashMap<>();
        initParams.put("exclusions","*.js,*.css,/druid/*");
 
        bean.setInitParameters(initParams);
 
        bean.setUrlPatterns(Arrays.asList("/*"));
 
        return  bean;
    }
}
三:对双数据源进行一些简短的测试
我们使用的是mybatis来操作数据库,两个数据库的名称分别是springboot和mybatis,从我们的配置中可以得知,我们放在master包下面的Dao操作的是springboot数据库,放在slave包下面的Dao操作的是mybatis数据库,我们简单的查询一下两个表里面的信息展示出来,其中Dao,Service,Mapper.xml我就省略不写了,截图如下

在启动的时候,我们会发现打印出下面的信息:

我们请求/moniter方法,让他们去查询数据并打印出来,发现能够从两个数据源当中的两个表当中查询出正确的结果。并且我们还看到了数据源在这个时候进行了初始化(inited):这样也可以得出结论就是:我们的数据连接池是在我们第一次使用的时候进行初始化的。

最后,我们进入druid监控,能够看到如下的信息

在这个页面往下滑动鼠标,会看到第二个数据源的信息

 

你可能感兴趣的:(随手记)