小工具知识网

当前位置: 首页 > 行业知识 > Springboot集成Druid实现监控功能

行业知识

Springboot集成Druid实现监控功能

2026-11-13 03:21:09 来源:互联网转载

Druid是阿里巴巴开发的号称为监控而生的数据库连接池,在功能、性能、扩展性方面,都超过其他数据库连接池,包括DBCP、C3P0、BoneCP、Proxool、JBoss DataSource等等等,秒杀一切。Druid可以很好的监控DB池连接和SQL的执行情况,天生就是针对监控而生的DB连接池。

官方的参考
https://github.com/alibaba/druid/wiki/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98

一、传统web项目(如ssh,ssm)

    com.alibaba    druid    1.1.23

使用xml或配置类配置好DruidDataSource

                                                                                                                

在web应用中的WEB-INF/web.xml中进行相关配置 

StatViewServletcom.alibaba.druid.support.http.StatViewServletloginUsernameadminloginPassword2024allowdenyStatViewServlet/druid/*WebStatFiltercom.alibaba.druid.support.http.WebStatFilterexclusions*.js,*.gif,*.css,*.ico,*.jpg,*.png,/druid/*WebStatFilter/*

二、springboot中引入原生的druid,依赖和上面一样,编写配置类即可

import com.alibaba.druid.filter.Filter;import com.alibaba.druid.filter.stat.StatFilter;import com.alibaba.druid.pool.DruidDataSource;import com.alibaba.druid.support.http.StatViewServlet;import com.alibaba.druid.wall.WallConfig;import com.alibaba.druid.wall.WallFilter;import org.springframework.beans.factory.annotation.Value;import org.springframework.boot.web.servlet.ServletRegistrationBean;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.context.annotation.Primary;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;@Configurationpublic class DruidConfig {    //登陆账号    private final String USERNAME = "root";    //登陆密码    private final String PASSWORD = "123";    @Value("${spring.datasource.url:#{null}}")    private String dbUrl;    @Value("${spring.datasource.username: #{null}}")    private String username;    @Value("${spring.datasource.password:#{null}}")    private String password;    @Value("${spring.datasource.driverClassName:#{null}}")    private String driverClassName;    /**     * 以下属性可在配置文件自行定义     */    private Integer initialSize = 5;    private Integer minIdle = 10;    private Integer maxActive = 20;    private Integer maxWait = 60000;    @Bean    @Primary    public DruidDataSource dataSource() {        DruidDataSource datasource = new DruidDataSource();        datasource.setUrl(this.dbUrl);        datasource.setUsername(username);        datasource.setPassword(password);        datasource.setDriverClassName(driverClassName);        if (initialSize != null) {            datasource.setInitialSize(initialSize);        }        if (minIdle != null) {            datasource.setMinIdle(minIdle);        }        if (maxActive != null) {            datasource.setMaxActive(maxActive);        }        if (maxWait != null) {            datasource.setMaxWait(maxWait);        }        List filters = new ArrayList();        filters.add(statFilter());        filters.add(wallFilter());        datasource.setProxyFilters(filters);        return datasource;    }    @Bean    public ServletRegistrationBean druidServlet() {        ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean();        servletRegistrationBean.setServlet(new StatViewServlet());        servletRegistrationBean.addUrlMappings("/druid/*");        Map initParameters = new HashMap();        //禁用HTML页面上的“Rest All”功能        initParameters.put("resetEnable", "false");        //ip白名单(没配置则允许所有访问)        //initParameters.put("allow", "");        //ip黑名单,如果某个ip同时存在,deny优先于allow        //initParameters.put("deny", "");        initParameters.put("loginUsername", USERNAME);        initParameters.put("loginPassword", PASSWORD);        servletRegistrationBean.setInitParameters(initParameters);        return servletRegistrationBean;    }    /**     * 配置WebStatFilter     * @return     */    @Bean    public FilterRegistrationBean webStatFilter(){        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();        //设置过滤器        filterRegistrationBean.setFilter(new WebStatFilter());        //url过滤规则        filterRegistrationBean.addUrlPatterns("/*");        //忽略        filterRegistrationBean.addInitParameter("exclusions","*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");        return filterRegistrationBean;    }    @Bean    public StatFilter statFilter() {        StatFilter statFilter = new StatFilter();        //慢sql记录        statFilter.setLogSlowSql(true);        statFilter.setMergeSql(true);        //超过多少时间为慢sql        statFilter.setSlowSqlMillis(3000);        return statFilter;    }    /**     * SQL防火墙拦截器(按需使用,达梦数据库启动会发生异常)     * @return     */    @Bean    public WallFilter wallFilter() {        WallFilter wallFilter = new WallFilter();        //允许执行多条SQL        WallConfig config = new WallConfig();        config.setMultiStatementAllow(true);        wallFilter.setConfig(config);        return wallFilter;    }}

三、springboot druid starter方式

com.alibabadruid-spring-boot-starter1.1.23

按需配置application.yml的内容

spring:  datasource:    url: ******    username: ******    password: ******    driver-class-name: com.mysql.cj.jdbc.Driver    type: com.alibaba.druid.pool.DruidDataSource  # 指定数据源类型    ######### 连接池 配置 ##########    druid:      # 配置初始化大小、最小、最大      initial-size: 5      minIdle: 10      max-active: 20      # 配置获取连接等待超时的时间(单位:毫秒)      max-wait: 60000      # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒#      time-between-eviction-runs-millis: 2000      # 配置一个连接在池中最小生存的时间,单位是毫秒#      min-evictable-idle-time-millis: 600000#      max-evictable-idle-time-millis: 900000      # 用来测试连接是否可用的SQL语句,默认值每种数据库都不相同,这是mysql#      validationQuery: select 1      # 应用向连接池申请连接,并且testOnBorrow为false时,连接池将会判断连接是否处于空闲状态,如果是,则验证这条连接是否可用#      testWhileIdle: true      # 如果为true,默认是false,应用向连接池申请连接时,连接池会判断这条连接是否是可用的#      testOnBorrow: false      # 如果为true(默认false),当应用使用完连接,连接池回收连接的时候会判断该连接是否还可用#      testOnReturn: false      # 是否缓存preparedStatement,也就是PSCache。PSCache对支持游标的数据库性能提升巨大,比如说oracle#      poolPreparedStatements: true      # 要启用PSCache,必须配置大于0,当大于0时, poolPreparedStatements自动触发修改为true,      # 在Druid中,不会存在Oracle下PSCache占用内存过多的问题,      # 可以把这个数值配置大一些,比如说100#      maxOpenPreparedStatements: 20      # 连接池中的minIdle数量以内的连接,空闲时间超过minEvictableIdleTimeMillis,则会执行keepAlive操作#      keepAlive: true      # Spring 监控,利用aop 对指定接口的执行时间,jdbc数进行记录      aop-patterns: "com.springboot.template.dao.*"      ########### 启用内置过滤器(第一个 stat必须,否则监控不到SQL)##########      filters: stat,wall,log4j2      # 自己配置监控统计拦截的filter      filter:        # 开启druiddatasource的状态监控        stat:          enabled: true          db-type: mysql          # 开启慢sql监控,超过2s 就认为是慢sql,记录到日志中          log-slow-sql: true          slow-sql-millis: 2000        # 日志监控,使用slf4j 进行日志输出#        slf4j:#          enabled: true#          statement-log-error-enabled: true#          statement-create-after-log-enabled: false#          statement-close-after-log-enabled: false#          result-set-open-after-log-enabled: false#          result-set-close-after-log-enabled: false      ########## 配置WebStatFilter,用于采集web关联监控的数据 ##########      web-stat-filter:        # 启动 StatFilter        enabled: true        # 过滤所有url        url-pattern: /*        # 排除一些不必要的url        exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"        # 开启session统计功能        session-stat-enable: true        # session的最大个数,默认100        session-stat-max-count: 1000      ########## 配置StatViewServlet(监控页面),用于展示Druid的统计信息 ##########      stat-view-servlet:        # 启用StatViewServlet        enabled: true        # 访问内置监控页面的路径,内置监控页面的首页是/druid/index.html        url-pattern: /druid/*        # 不允许清空统计数据,重新计算        reset-enable: false        # 配置监控页面访问密码        login-username: root        login-password: 123        # 允许访问的地址,如果allow没有配置或者为空,则允许所有访问#        allow:        # 拒绝访问的地址,deny优先于allow,如果在deny列表中,就算在allow列表中,也会被拒绝#        deny:

访问监控页面

页面简单介绍 

1、数据源页面:是当前DataSource配置的基本信息,上述配置的Filter可以在里面找到,如果没有配置Filter(一些信息会无法统计,例如“SQL监控”,会无法获取JDBC相关的SQL执行信息)。

2、SQL监控页面:统计了所有SQL语句的执行情况。

3、URL监控页面:统计了所有Controller接口的访问以及执行情况。

4、Spring 监控页面,利用aop 对指定接口的执行时间,jdbc数进行记录。

5、SQL防火墙页面:druid提供了黑白名单的访问,可以清楚的看到sql防护情况。

6、Session监控页面:可以看到当前的session状况,创建时间、最后活跃时间、请求次数、请求时间等详细参数。

7、JSONAPI 页面:通过api的形式访问Druid的监控接口,api接口返回Json形式数据。 

上一篇:服务器外接磁盘怎么设置?

下一篇:CAE,揭秘其内涵与应用,一文带你全面了解!