1、druid githun项目地址

https://github.com/alibaba/druid

https://github.com/alibaba/druid/wiki/常见问题 (必看)

 

2、druid 的过滤器 (重要)

stat,wall,log4j2

stat:Druid内置提供一个StatFilter,用于统计监控信息。

wall:Druid防御SQL注入攻击的WallFilter就是通过Druid的SQL Parser分析。Druid提供的SQL Parser可以在JDBC层拦截SQL做相应处理,比如说分库分表、审计等。

log4j2:这个就是日志记录的功能,可以把sql语句打印到log4j2供排查问题。

 

3、在项目中引入druid maven依赖

3、spring boot 配置druid 连接池及监控

4、在application.properties 中配置druid启动参数

druid 参数配置

###### druid 连接池驱动配置信息#############

spring.datasource.type=com.alibaba.druid.pool.DruidDataSource

#mysql

#spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver

#spring.datasource.url = jdbc:mysql://localhost:3306/test?rewriteBatchedStatements=true&useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=GMT%2B8

#spring.datasource.username = root

#spring.datasource.password = root

 

#oracle

spring.datasource.url = jdbc:oracle:thin:@//192.168.0.166:1521/PDBFJ

spring.datasource.driverClassName = oracle.jdbc.driver.OracleDriver

spring.datasource.username=basefj

spring.datasource.password=rootroot

#连接池的配置信息

# 初始化大小,最小,最大

spring.datasource.initialSize=5

spring.datasource.minIdle=5

spring.datasource.maxActive=20

# 配置获取连接等待超时的时间

spring.datasource.maxWait=60000

# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒

spring.datasource.timeBetweenEvictionRunsMillis=60000

# 配置一个连接在池中最小生存的时间,单位是毫秒

spring.datasource.minEvictableIdleTimeMillis=300000

#测试连接

#spring.datasource.validationQuery=SELECT 1 FROM DUAL

spring.datasource.validationQuery=SELECT * FROM  SYS_USERS

#申请连接的时候检测,建议配置为true,不影响性能,并且保证安全性

spring.datasource.testWhileIdle=true

#获取连接时执行检测,建议关闭,影响性能

spring.datasource.testOnBorrow=false

#归还连接时执行检测,建议关闭,影响性能

spring.datasource.testOnReturn=false

#是否开启PSCache,PSCache对支持游标的数据库性能提升巨大,oracle建议开启,mysql下建议关闭

spring.datasource.poolPreparedStatements=false

#开启poolPreparedStatements后生效

spring.datasource.maxPoolPreparedStatementPerConnectionSize=20

# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙,log4j2:日志

spring.datasource.filters=stat,wall,log4j2

# 通过connectProperties属性来打开mergeSql功能;慢SQL记录

spring.datasource.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000

##日志配置

# 配置日志输出

spring.datasource.druid.filter.slf4j.enabled=true

spring.datasource.druid.filter.slf4j.statement-create-after-log-enabled=false

spring.datasource.druid.filter.slf4j.statement-close-after-log-enabled=false

spring.datasource.druid.filter.slf4j.result-set-open-after-log-enabled=false

spring.datasource.druid.filter.slf4j.result-set-close-after-log-enabled=false

 

5、配置数据源 @Configuration + @Bean 的方式注册


(1) 声明 DruidConfig类 并添加 @Configuration 注解

(2)注册bean @Bean

DruidConfig 启动配置类

/**

 * @author changneng

 * @version 1.0

 * @title: DruidConfig

 * @description: 配置druid数据源

 * @date 2019/3/1117:07

 */

@Configuration

public class DruidConfig {

 

   private static Logger logger = LoggerFactory.getLogger(DruidConfig.class);

       @Value("${spring.datasource.url}")

       private String dbUrl;

        

       @Value("${spring.datasource.username}")

       private String username;

        

       @Value("${spring.datasource.password}")

       private String password;

        

       @Value("${spring.datasource.driverClassName}")

       private String driverClassName;

        

       @Value("${spring.datasource.initialSize}")

       private int initialSize;

        

       @Value("${spring.datasource.minIdle}")

       private int minIdle;

        

       @Value("${spring.datasource.maxActive}")

       private int maxActive;

        

       @Value("${spring.datasource.maxWait}")

       private int maxWait;

        

       @Value("${spring.datasource.timeBetweenEvictionRunsMillis}")

       private int timeBetweenEvictionRunsMillis;

        

       @Value("${spring.datasource.minEvictableIdleTimeMillis}")

       private int minEvictableIdleTimeMillis;

        

       @Value("${spring.datasource.validationQuery}")

       private String validationQuery;

        

       @Value("${spring.datasource.testWhileIdle}")

       private boolean testWhileIdle;

        

       @Value("${spring.datasource.testOnBorrow}")

       private boolean testOnBorrow;

        

       @Value("${spring.datasource.testOnReturn}")

       private boolean testOnReturn;

        

       @Value("${spring.datasource.poolPreparedStatements}")

       private boolean poolPreparedStatements;

        

       @Value("${spring.datasource.maxPoolPreparedStatementPerConnectionSize}")

       private int maxPoolPreparedStatementPerConnectionSize;

        

       @Value("${spring.datasource.filters}")

       private String filters;

        

       @Value("{spring.datasource.connectionProperties}")

       private String connectionProperties;

 

     @Bean     //声明其为Bean实例

      @Primary  //在同样的DataSource中,首先使用被标注的DataSource

       public DataSource dataSource(){

          DruidDataSource datasource = new DruidDataSource();

 

          datasource.setUrl(this.dbUrl);

          datasource.setUsername(username);

          datasource.setPassword(password);

          datasource.setDriverClassName(driverClassName);

           

          //configuration

          datasource.setInitialSize(initialSize);

          datasource.setMinIdle(minIdle);

          datasource.setMaxActive(maxActive);

          datasource.setMaxWait(maxWait);

          datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);

          datasource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);

          datasource.setValidationQuery(validationQuery);

          datasource.setTestWhileIdle(testWhileIdle);

          datasource.setTestOnBorrow(testOnBorrow);

          datasource.setTestOnReturn(testOnReturn);

          datasource.setPoolPreparedStatements(poolPreparedStatements);

          datasource.setMaxPoolPreparedStatementPerConnectionSize(maxPoolPreparedStatementPerConnectionSize);

          try {

            datasource.setFilters(filters);

         catch (SQLException e) {

            logger.error("druid初始化失败", e);

 

         }

          datasource.setConnectionProperties(connectionProperties);

           

          return datasource;

       }

 

 

 

}

注: 注册bean后,在spring bean工厂里可以找到dataSource 实例了, 集成mybatis后,会自动注入到sqlFactotry中

6、配置druid 监控


(1)声明druid webservlet @WebServlet

 

druid webservlet

package com.chn.frameweb.core.servlet;

 

import javax.servlet.annotation.WebInitParam;

import javax.servlet.annotation.WebServlet;

 

import com.alibaba.druid.support.http.StatViewServlet;

 

@WebServlet(urlPatterns = "/druid/*", initParams = {

      @WebInitParam(name = "allow", value = "127.0.0.1,localhost"), // IP白名单(没有配置或者为空,则允许所有访问)

      //@WebInitParam(name = "deny", value = ""), // IP黑名单 (存在共同时,deny优先于allow)

      @WebInitParam(name = "loginUsername", value = "admin"), // 用户名

      @WebInitParam(name = "loginPassword", value = "chn12369"), // 密码

      @WebInitParam(name = "resetEnable", value = "false")// 禁用HTML页面上的“Reset All”功能

                                              

})

public class DruidStatServlet extends StatViewServlet {

 

    

   private static final long serialVersionUID = 8445387246000214665L;

           

             

}

(2)配置druid 过滤器 DruidStatFilter

 

DruidStatFilter

/**

 * @author changneng

 * @version 1.0

 * @title: DruidConfig

 * @description: druid过滤器:过滤请求链接,将静态资源及druid本身的请求去除过滤

 * @date 2019/3/1117:07

 */

@WebFilter(filterName = "druidStatFilter", urlPatterns = "/*", initParams = {

      @WebInitParam(name = "exclusions", value = "*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*") })

public class DruidStatFilter extends WebStatFilter {

 

}

 

 

(3)访问监控页面 http://ip:port/druid/index.html, 例            如 http://localhost:8080/druid/index.html

3、spring boot 配置druid 连接池及监控

相关文章: