一、Druid监控功能概述

Druid作为阿里巴巴开源的数据库连接池,不仅提供了高效的连接池管理功能,还内置了强大的监控统计功能。通过Druid的监控功能,我们可以实时了解:

  1. SQL执行情况统计
  2. 连接池状态监控
  3. Web应用URI请求监控
  4. Session监控
  5. Spring监控(需额外配置)
  6. 慢SQL检测与分析
  7. 连接泄漏检测
  8. 防火墙防御统计

这些监控数据对于系统性能调优、慢SQL发现、连接泄漏检测等场景非常有价值,能够帮助开发人员快速定位数据库访问瓶颈。

二、基础监控配置

1. 添加Maven依赖

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.2.8</version>
</dependency>

建议同时添加日志依赖,便于查看监控日志:

<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
</dependency>

2. Spring Boot基础配置

在application.yml中添加以下配置:

spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    druid:
      # 数据库连接配置
      url: jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=UTC&characterEncoding=utf8
      username: root
      password: 123456
      driver-class-name: com.mysql.cj.jdbc.Driver
      
      # 连接池配置
      initial-size: 5
      min-idle: 5
      max-active: 20
      max-wait: 60000
      
      # 监控配置
      stat-view-servlet:
        enabled: true
        login-username: admin    # 生产环境必须修改
        login-password: admin    # 生产环境必须修改
        reset-enable: false     # 禁用重置功能
        url-pattern: /druid/*
        allow: 127.0.0.1        # 白名单
        deny: 192.168.1.100     # 黑名单
      
      web-stat-filter:
        enabled: true
        url-pattern: /*
        exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"
        session-stat-enable: true    # 启用session统计
        session-stat-max-count: 1000 # session统计最大数量

3. 访问监控页面

启动应用后,访问 http://localhost:8080/druid 即可看到Druid的监控首页。首页展示了数据源、SQL监控、SQL防火墙等多个功能模块的入口。

三、高级监控功能配置

1. SQL监控配置

spring:
  datasource:
    druid:
      filters: stat,wall,log4j
      filter:
        stat:
          enabled: true
          slow-sql-millis: 1000    # 慢SQL阈值,单位毫秒
          log-slow-sql: true        # 记录慢SQL日志
          merge-sql: true           # 合并相似SQL
        wall:
          enabled: true
          config:
            delete-allow: false     # 禁止delete语句
            drop-table-allow: false # 禁止drop table语句
            create-table-allow: true
            alter-table-allow: true

2. Spring监控配置

首先添加AOP依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

然后在配置类中添加:

@Configuration
@EnableAspectJAutoProxy
public class DruidConfig {
    
    @Bean
    public ServletRegistrationBean<StatViewServlet> statViewServlet() {
        ServletRegistrationBean<StatViewServlet> registration = 
            new ServletRegistrationBean<>(new StatViewServlet(), "/druid/*");
        // 添加初始化参数
        registration.addInitParameter("loginUsername", "admin");
        registration.addInitParameter("loginPassword", "admin");
        registration.addInitParameter("resetEnable", "false");
        return registration;
    }
    
    @Bean
    public FilterRegistrationBean<WebStatFilter> webStatFilter() {
        FilterRegistrationBean<WebStatFilter> filter = 
            new FilterRegistrationBean<>(new WebStatFilter());
        filter.addUrlPatterns("/*");
        filter.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
        // 添加session监控配置
        filter.addInitParameter("sessionStatEnable", "true");
        filter.addInitParameter("sessionStatMaxCount", "1000");
        return filter;
    }
    
    @Bean
    public DruidStatInterceptor druidStatInterceptor() {
        return new DruidStatInterceptor();
    }
    
    @Bean
    @ConditionalOnMissingBean
    public JdkRegexpMethodPointcut druidStatPointcut() {
        JdkRegexpMethodPointcut pointcut = new JdkRegexpMethodPointcut();
        // 设置需要监控的包路径
        pointcut.setPatterns(
            "com.example.demo.service.*",
            "com.example.demo.controller.*",
            "com.example.demo.dao.*"
        );
        return pointcut;
    }
    
    @Bean
    public Advisor druidStatAdvisor() {
        return new DefaultPointcutAdvisor(druidStatPointcut(), druidStatInterceptor());
    }
}

四、监控功能使用详解

1. 数据源监控

在Druid监控页面的"数据源"标签页,可以看到以下关键指标:

  • 连接池使用情况

    • 初始化连接数
    • 最小空闲连接数
    • 最大活跃连接数
    • 当前活跃连接数
    • 连接等待次数
    • 连接获取时间统计
  • 连接泄漏检测

    • 如果RemoveAbandoned设置为true,会显示被回收的连接
    • 活跃连接持续时间过长可能表明存在连接泄漏

2. SQL监控

SQL监控页面展示以下重要信息:

  • SQL执行统计

    • 执行次数
    • 总执行时间
    • 最慢执行时间
    • 平均执行时间
    • 影响行数统计
  • 慢SQL分析

    • 标记执行时间超过slow-sql-millis阈值的SQL
    • 按执行时间排序,快速定位性能瓶颈
  • SQL执行分布

    • SQL执行时间分布直方图
    • SQL执行+结果集处理时间分布

3. SQL防火墙

可以查看以下防御信息:

  • 防御统计

    • 拦截的SQL类型统计
    • 黑名单拦截统计
    • 白名单拦截统计
  • 访问模式分析

    • 表访问统计
    • 函数调用统计
    • 对象访问统计
    • 敏感操作审计

4. Web应用监控

展示以下Web层信息:

  • URI访问统计

    • 请求次数统计
    • 请求耗时分析
    • 并发请求监控
  • Session监控

    • 活跃Session数量
    • Session创建时间
    • Session最后访问时间
  • Spring方法调用监控

    • 方法调用次数
    • 方法调用耗时
    • 方法调用层次关系

五、常见问题与解决方案

1. 监控页面无法访问

检查步骤

  1. 确认stat-view-servlet.enabled设置为true
  2. 检查url-pattern配置是否正确(默认为/druid/*)
  3. 检查是否有安全框架(如Spring Security)拦截了/druid/*路径
  4. 查看应用日志是否有相关错误信息

解决方案

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
            .antMatchers("/druid/**").permitAll() // 放行Druid监控路径
            // 其他配置...
    }
}

2. 监控数据不显示

可能原因

  1. filters未配置stat
  2. 使用了特殊的JDBC URL导致监控失效
  3. 监控过滤器未正确注册

解决方案

spring:
  datasource:
    druid:
      filters: stat,wall,log4j
      filter:
        stat:
          enabled: true
          db-type: mysql # 明确指定数据库类型

3. 性能影响优化

虽然Druid监控对性能影响很小,但在高并发场景下可以:

  1. 关闭merge-sql(设为false)
  2. 调大slow-sql-millis阈值(如从1000调整到2000)
  3. 减少监控数据采集频率
  4. 只监控关键SQL和方法
spring:
  datasource:
    druid:
      filter:
        stat:
          merge-sql: false
          slow-sql-millis: 2000
          log-slow-sql: false

六、生产环境最佳实践

  1. 安全配置

    • 必须修改默认的登录用户名和密码
    • 通过allow/deny配置限制访问IP
    • 启用HTTPS访问监控页面
    • 定期审计监控日志
  2. 性能调优

    • 根据监控数据调整连接池参数
    • 定期检查并优化慢SQL
    • 监控连接泄漏情况(关注活跃连接数)
  3. 告警集成

    • 配置慢SQL告警阈值
    • 设置连接池使用率告警
    • 监控关键业务SQL执行情况
  4. 可视化监控

    • 结合Prometheus+Grafana实现可视化监控
    • 集成到企业统一监控平台
    • 建立关键指标Dashboard
  5. 定期维护

    • 定期清理历史监控数据
    • 升级Druid到最新稳定版本
    • 根据业务变化调整监控策略

通过合理配置和使用Druid的监控功能,可以极大提升数据库访问的可观测性,帮助开发者及时发现和解决数据库性能问题,为系统稳定运行提供有力保障。

  • . - - - - - - - .
Logo

一站式 AI 云服务平台

更多推荐