Druid 官方 Wiki

所有的配置信息都可以参考:https://github.com/alibaba/druid/wiki

在这里插入图片描述

Druid属性详解

DruidDataSource配置属性列表
实际配置示例

 <bean id="Druid-CP-Create" class="java.util.concurrent.ScheduledThreadPoolExecutor">
    <constructor-arg value="3" index="0" />
  </bean>
  <bean id="Druid-CP-Destroy" class="java.util.concurrent.ScheduledThreadPoolExecutor">
    <constructor-arg value="3" index="0" />
  </bean>
  <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
    <!-- 基本属性 url、user、password -->
    <property name="url" value="${jdbc.url}" />
    <property name="username" value="${jdbc.username}" />
    <!-- <property name="password" value="xxxxx" /> -->
    <property name="passwordCallback" ref="xxxxxxPasswordCallback" />
    <!-- 配置初始化大小、最小、最大 -->
    <property name="initialSize" value="${jdbc.initialSize}" />
    <property name="minIdle" value="${jdbc.minIdle}" />
    <property name="maxActive" value="${jdbc.maxActive}" />
    <!-- 配置获取连接等待超时的时间 -->
    <property name="maxWait" value="${jdbc.maxWait}" />
    <property name="createScheduler" ref="Druid-CP-Create" />
    <property name="destroyScheduler" ref="Druid-CP-Destroy" />
    <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
    <property name="timeBetweenEvictionRunsMillis" value="${jdbc.timeBetweenEvictionRunsMillis}" />
    <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
    <property name="minEvictableIdleTimeMillis" value="${jdbc.minEvictableIdleTimeMillis}" />
    <!-- 空闲连接保活 -->
    <property name="keepAlive" value="true" />
    <!-- 检测语句强制用执行SQL(规避网关的假连接,参考启动属性:-Ddruid.mysql.usePingMethod=false) -->
    <property name="validationQuery" value="SELECT 1" />
    <property name="testWhileIdle" value="true" />
    <property name="testOnBorrow" value="true" />
    <property name="testOnReturn" value="false" />
    <!-- 打开PSCache,并且指定每个连接上PSCache的大小 -->
    <property name="poolPreparedStatements" value="false" />
    <!-- 使用MySQL 低版本驱动时指定连接使用utf8mb4,以便于支持4字节的emoji字符和GB18030-2022规范所要求的生僻字  -->
      <property name="connectionInitSqls">
          <list>
              <value>set NAMES 'utf8mb4'</value>
          </list>
      </property>
    <property name="connectProperties">
      <props>
      <prop key="MySQLIndexMergeOff">true</prop>
      </props>
    </property>
    <!-- 配置监控统计拦截的filters -->
    <property name="filters" value="stat,slf4j" />
    <!-- 配置监控统计filters -->
    <property name="proxyFilters">
      <list>
        <ref bean="stat-filter" />
      </list>
    </property>
  </bean>
  <bean id="xxxxxxPasswordCallback" class="cn.xxxx.druid.DruidPasswordCallback">
    <property name="password">
      <bean factory-bean="password" factory-method="toCharArray" />
    </property>
    <property name="sysPublicKeyFilePath" value="classpath:sys_pub.pem" />
    <property name="appPrivateKeyFilePath" value="classpath:sys_priv.pem" />
  </bean>
<!--加密后的密码密文内容 -->
  <bean id="password" class="java.lang.String">
    <constructor-arg index="0" value="${jdbc.password}" />
  </bean>
<!-- 自定义扩展增强的 stat filter-->
  <bean id="stat-filter" class="cn.xxxx.druid.DruidStatFilter">
    <!-- SQL 慢查询的时长 -->
    <property name="slowSqlMillis" value="200" />
    <property name="logSlowSql" value="true" />
    <property name="mergeSql" value="true" />
    <property name="maxSampleCountPerMergeSql" value="10" />
    <property name="maxUpdateCountNeedWarning" value="1000" />
    <property name="maxQueryFetchCountNeedWarning" value="1000" />
    <property name="maxQueryPacketSizeNeedWarning" value="512000" />
    <property name="slowTransactionnMillis" value="500" />
  </bean>

配置过滤器Filter完成SQL监控

DruidDataSource 支持通过 Filter-Chain(过滤器链) 模式进行扩展, 类似于 Servlet 的 Filter 机制,可以方便地拦截和增强 任何 JDBC 方法 的执行过程。

Druid 提供 两种配置 Filter 的方式:

  1. 通过 filters 属性配置
  2. 通过 proxyFilters 属性配置

✅ 注意:
filters 和 proxyFilters 的配置是 组合关系(complementary),而 不是替换关系(not mutually exclusive)。

简要说明

配置项说明
filters通过字符串指定内置或自定义过滤器别名(如 stat, wall, log4j2 等),Druid 会自动加载对应的 Filter 实现类。
proxyFilters通过手动注入 Filter 实例到 DruidDataSource 的 proxyFilters 属性,可自定义扩展逻辑,适用于更复杂的监控或拦截需求。

示例配置

spring:
  datasource:
    druid:
      filters: stat,wall
      proxy-filters:
        - com.example.druid.filter.CustomLogFilter

内置Filter的别名

Filter类名别名(全限定类名)
defaultcom.alibaba.druid.filter.stat.StatFilter
statcom.alibaba.druid.filter.stat.StatFilter
mergeStatcom.alibaba.druid.filter.stat.MergeStatFilter
encodingcom.alibaba.druid.filter.encoding.EncodingConvertFilter
log4jcom.alibaba.druid.filter.logging.Log4jFilter
log4j2com.alibaba.druid.filter.logging.Log4j2Filter
slf4jcom.alibaba.druid.filter.logging.Slf4jLogFilter
commonloggingcom.alibaba.druid.filter.logging.CommonsLogFilter
wallcom.alibaba.druid.wall.WallFilter

StatFilter(控制台功能点:SQL监控)

Druid内置提供一个StatFilter,用于统计监控信息。统计「SQL / JDBC 级别」的执行情况(慢 SQL、连接耗时、执行次数)。
在这里插入图片描述

WallFilter(控制台功能点:SQL防火墙)

WallFilter的功能是防御SQL注入攻击。它是基于SQL语法分析,理解其中的SQL语义,然后做处理的,智能,准确,误报率低。
在这里插入图片描述

LogFilter

Druid 内置提供了 四种日志过滤器(LogFilter), 用于 输出 JDBC 执行日志,包括 SQL 语句、执行时间、异常信息等。
这些过滤器均基于 Filter-Chain 扩展机制 实现,可自由组合使用。

内置 LogFilter 类型

Filter 名称实现类说明
Log4jFiltercom.alibaba.druid.filter.logging.Log4jFilter使用 Log4j 输出 SQL 执行日志。
Log4j2Filtercom.alibaba.druid.filter.logging.Log4j2Filter使用 Log4j2 输出 SQL 日志,更适合现代项目。
CommonsLogFiltercom.alibaba.druid.filter.logging.CommonsLogFilter使用 Apache Commons Logging 输出 SQL 日志。
Slf4jLogFiltercom.alibaba.druid.filter.logging.Slf4jLogFilter使用 SLF4J 框架输出 SQL 日志,推荐在 Spring Boot 等统一日志体系中使用。

典型配置方式

spring:
  datasource:
    druid:
      # 启用 SQL 统计与日志过滤器
      filters: stat,slf4j

Druid中使用log4j2进行日志输出

WebStatFilter(控制台功能点:Web应用/URI监控)

WebStatFilter 用于采集 web-jdbc 关联监控的数据。统计「HTTP / Web 请求 → JDBC」的关联关系(哪个 URL 用了多少 SQL、多慢)。
在这里插入图片描述
在这里插入图片描述
druid 0.2.7版本开始支持profile,配置profileEnable能够监控单个url调用的sql列表
在这里插入图片描述

配置Druid和Spring关联监控配置(对应控制台功能点:Spring监控)

需要自定义一个 Spring Stat(Druid)AOP 监控配置类。

package cn.hao.kai.config.datasource;

import com.alibaba.druid.support.spring.stat.DruidStatInterceptor;
import org.springframework.aop.Advisor;
import org.springframework.aop.support.DefaultPointcutAdvisor;
import org.springframework.aop.support.JdkRegexpMethodPointcut;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
import org.springframework.context.annotation.Role;

/**
 * <h2>Druid Spring Stat(方法级性能监控)配置</h2>
 *
 * <p><b>作用</b></p>
 * <ul>
 *   <li>统计 Service / Mapper 方法调用次数与耗时</li>
 *   <li>将方法执行与其内部 SQL 统计进行关联</li>
 *   <li>对应控制台功能点:Spring监控</li>
 * </ul>
 *
 * <p><b>生效环境</b></p>
 * <ul>
 *   <li>dev / test:启用(用于性能分析与问题定位)</li>
 *   <li>prod:禁用(生产环境使用 Hikari,避免 AOP 开销)</li>
 * </ul>
 *
 * <p><b>设计原则</b></p>
 * <ul>
 *   <li>只拦截业务层方法(Service / 可选 Mapper)</li>
 *   <li>不拦截 Controller(已由 WebStat 覆盖)</li>
 *   <li>精确包路径匹配,避免全量 AOP 扫描</li>
 *   <li>严格通过 Spring Profile 做环境隔离</li>
 * </ul>
 *
 * <p><b>技术依据</b></p>
 * <ul>
 *   <li>Spring AOP 官方 API(Pointcut + Advisor + MethodInterceptor)</li>
 *   <li>Druid 官方 Spring Stat 实现:
 *     <a href="https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_Druid%E5%92%8CSpring%E5%85%B3%E8%81%94%E7%9B%91%E6%8E%A7%E9%85%8D%E7%BD%AE">
 *       配置_Druid和Spring关联监控配置
 *     </a>
 *   </li>
 * </ul>
 * =====================================================================
 */
@Configuration
@Profile({"dev", "test"}) // 仅 dev / test 环境启用
@Role(BeanDefinition.ROLE_INFRASTRUCTURE) // 容器基础设施 Bean(AOP / 事务 / 监控)
public class DruidSpringStatAopConfig {

    /**
     * <b>Druid 方法拦截器(MethodInterceptor)</b>
     *
     * <p><b>职责</b></p>
     * <ul>
     *   <li>拦截方法调用</li>
     *   <li>记录方法耗时与调用次数</li>
     *   <li>关联当前线程内的 SQL 执行统计</li>
     * </ul>
     *
     * <p><b>说明</b></p>
     * <ul>
     *   <li>本身不会生效,必须与 Pointcut 绑定</li>
     *   <li>无状态对象,可安全复用为单例 Bean</li>
     * </ul>
     */
    @Bean
    @Role(BeanDefinition.ROLE_INFRASTRUCTURE)
    public DruidStatInterceptor druidStatInterceptor() {
        return new DruidStatInterceptor();
    }

    /**
     * <b>方法切点(Pointcut)定义</b>
     *
     * <p><b>拦截范围</b></p>
     * <ul>
     *   <li>Service 层业务方法</li>
     *   <li>(默认)不拦截 Mapper 层</li>
     * </ul>
     *
     * <p><b>不拦截 Mapper 的原因</b></p>
     * <ul>
     *   <li>Druid 已在 JDBC 层完整统计 SQL 执行信息</li>
     *   <li>Mapper 层再次拦截会造成重复统计</li>
     *   <li>高并发场景下会放大 AOP 性能开销</li>
     * </ul>
     *
     * <p><b>实现方式</b></p>
     * <ul>
     *   <li>使用 JDK 正则匹配方法签名</li>
     *   <li>匹配在启动阶段完成,不影响运行期性能</li>
     * </ul>
     */
    @Bean
    @Role(BeanDefinition.ROLE_INFRASTRUCTURE)
    public JdkRegexpMethodPointcut druidStatPointcut() {
        JdkRegexpMethodPointcut pointcut = new JdkRegexpMethodPointcut();
        pointcut.setPatterns(
                "cn\\.hao\\.kai\\.service(\\..*)?"
        );
        return pointcut;
    }

    /**
     * <b>Advisor:绑定 Pointcut 与 Interceptor</b>
     *
     * <p><b>作用链路</b></p>
     * <ul>
     *   <li>Spring 扫描 Advisor</li>
     *   <li>命中 Pointcut 的 Bean 生成 AOP 代理</li>
     *   <li>方法调用时进入 DruidStatInterceptor</li>
     * </ul>
     *
     * <p><b>生产环境说明</b></p>
     * <ul>
     *   <li>prod 环境不会加载该配置类</li>
     *   <li>不会创建任何 Spring AOP 代理</li>
     *   <li>生产环境使用 HikariCP,避免 AOP 额外开销</li>
     * </ul>
     */
    @Bean
    @Role(BeanDefinition.ROLE_INFRASTRUCTURE)
    public Advisor druidStatAdvisor(DruidStatInterceptor interceptor,
                                    JdkRegexpMethodPointcut pointcut) {
        return new DefaultPointcutAdvisor(pointcut, interceptor);
    }
}

在这里插入图片描述
在这里插入图片描述

SpringBoot Druid连接池完整配置

spring:
  datasource:
    # ========================= 开发 / 测试环境 Druid 数据源(生产建议切 Hikari) =========================
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:23306/demo?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai&useSSL=true&rewriteBatchedStatements=true&allowMultiQueries=true
    username: root
    password: 123456

    # 【Druid 配置】 🌐[官方文档]:https://github.com/alibaba/druid/wiki
    druid:
      # ==============================================================================
      # 【一、 连接池容量与流量削峰】
      # ==============================================================================
      initial-size: 20 # 💡[设计原理]启动时即创建20个连接。 🫵[通用规范]通常与min-idle保持一致,避免冷启动或突发流量时因建连导致排队。
      min-idle: 20 # 💡[设计原理]池内核心常驻连接数。 🫦[生产语义]按平峰QPS配置,保证轮询/短查询始终复用热连接。
      max-active: 200 # 💡[设计原理]连接池并发上限。 🫦[生产语义]需小于DB max_connections 的20%~30%,避免单应用压垮数据库。
      max-wait: 10000 # 💡[设计原理]获取连接最大等待时间。 🫵[生产规范]严禁-1(无限等待),否则数据库异常会拖垮业务线程池。

      # ==============================================================================
      # 【二、 连接泄漏检测(仅用于 dev / test,生产必须关闭)】
      # ==============================================================================
      remove-abandoned: true # 💡[设计原理]回收“疑似未归还”的连接。 👥[环境区分]dev/test 用于发现忘记 close() 的代码;🫵[生产规范]必须关闭,分钟级SQL场景会被误杀。
      remove-abandoned-timeout: 360 # 💡[设计原理]判定连接“疑似泄漏”的超时阈值。 👥[环境区分]仅在dev/test生效,且必须 > 业务最长SQL(如5分钟),否则合法慢SQL会被强杀。
      log-abandoned: true # 💡[设计原理]回收时打印获取连接的调用堆栈。 👥[环境区分]dev/test 打日志定位责任代码;🫵[生产规范]必须关闭,避免额外性能与日志噪音。

      # ==============================================================================
      # 【三、 连接活性探测(短轮询 + 高并发的核心配置)】
      # ==============================================================================
      validation-query: SELECT 1 # 💡[设计原理]连接心跳SQL。 🫵[通用规范]MySQL用SELECT 1,Oracle用SELECT 1 FROM DUAL。
      test-while-idle: true # 💡[设计原理]仅在连接空闲时做可用性检测。 💪[性能核心]异步执行,不影响业务线程,是生产必开项。
      test-on-borrow: false # 💡[设计原理]借连接时是否检测。 💪[性能核心]必须为false,否则每次借连接都会多一次SQL,RT显著上升。
      test-on-return: false # 💡[设计原理]归还连接时是否检测。 💪[性能取舍]关闭可减少IO与锁竞争,避免无意义校验。
      keep-alive: true # 💡[设计原理]主动维持空闲连接活性。 🫦[生产语义]防止min-idle中的长连接被防火墙/LB/DB idle timeout 掐断。

      # ==============================================================================
      # 【四、 连接回收与生命周期管理】
      # ==============================================================================
      time-between-eviction-runs-millis: 60000 # 💡[设计原理]空闲连接扫描周期。 🧬[默认值]60秒,平衡及时回收与后台线程开销。
      min-evictable-idle-time-millis: 300000 # 💡[设计原理]连接最小空闲存活时间。 🗣️[经验值]5分钟,避免连接在流量波动中被频繁回收。
      max-evictable-idle-time-millis: 1800000 # 💡[设计原理]连接最大允许空闲时间。 🫵[生产规范]必须小于数据库 wait_timeout,防止持有“已被DB关闭”的死连接。
      phy-timeout-millis: 28800000 # 💡[设计原理]物理连接最大生命周期。 🗣️[生产建议]8小时,周期性重建连接,规避网络/驱动层老化问题。

      # ==============================================================================
      # 【五、 PreparedStatement 缓存(按SQL稳定性选择性开启)】
      # ==============================================================================
      pool-prepared-statements: true # 💡[设计原理]缓存PreparedStatement。 👥[环境区分]SQL高度固定的写入场景可开;▲[生产注意]动态SQL多时命中率极低,建议关闭。
      max-pool-prepared-statement-per-connection-size: 50 # 💡[设计原理]单连接PS缓存上限。 🗣️[经验值]50为安全值,过大会增加内存占用甚至引发Metaspace压力。

      # ==============================================================================
      # 【六、 监控控制台(仅用于非生产或受控生产环境)】 🌐[访问地址]http://{ip}:{port}/monitor/db/druid/login.html
      # ==============================================================================
      stat-view-servlet:
        enabled: true # 💡[设计原理]启用Druid监控控制台。 👥[环境区分]dev/test必开;🫵[生产规范]若开启必须配合访问控制。
        url-pattern: /monitor/db/druid/* # 💡[设计原理]控制台访问路径。 🫵[生产规范]生产必须使用非默认、不可猜测路径。
        login-username: haokai # 🫆[安全规范]禁止使用默认账号。
        login-password: Pass@1688 # 🫆[安全规范]必须使用强密码并妥善保管。
        allow: "" # 🫦[安全语义]允许访问的IP白名单。 🗣️[生产建议]限制为内网或堡垒机IP。
        deny: "" # 🫦[安全语义]拒绝访问的IP段。
        reset-enable: false # 💡[设计原理]是否允许重置统计数据。 🫵[生产规范]必须关闭,防止误清空历史慢SQL信息。

      # ==============================================================================
      # 【七、 SQL 审计 / 防注入 / Web 统计】
      # ==============================================================================
      filters: stat,wall,slf4j # 不声明 filters,下面的 stat / wall / slf4j 都不会生效
      filter:
        stat: # 📌[控制台功能点:SQL监控]
          enabled: true # 💡[设计原理]统计「SQL / JDBC 级别」的执行情况(慢 SQL、连接耗时、执行次数)。 👥[环境区分]dev/test常开;生产需评估开销。 🧬[默认值]false。
          merge-sql: true # 💡[设计原理]合并同结构SQL统计。 🫵[生产规范]防止因参数不同导致统计维度爆炸。
          slow-sql-millis: 3000 # 💡[设计原理]慢SQL阈值。 🗣️[生产建议]结合业务RT容忍度,常见取值3s。
          log-slow-sql: true # 💡[设计原理]慢SQL是否写日志。 🫵[生产规范]必须开启,便于日志系统长期分析。
        wall: # 📌[控制台功能点:SQL防火墙]
          db-type: mysql # 💡[设计原理]按数据库类型启用防注入规则。 🫦[安全语义]拦截高风险SQL(drop/delete等)。
        slf4j:
          enabled: true # 💡[设计原理]将SQL执行信息输出到日志系统。 🫵[生产规范]开启,便于统一日志收敛。
      web-stat-filter: # 📌[控制台功能点:Web应用 / URI监控]
        enabled: true # 💡[设计原理]统计「HTTP / Web 请求 → JDBC」的关联关系(哪个 URL 用了多少 SQL、多慢)。 👥[环境区分]dev/test常开;生产需评估开销。 🧬[默认值]false。
        profile-enable: true # 💡[设计原理]druid 0.2.7版本开始支持profile,配置profileEnable能够监控单个url调用的sql列表。
        url-pattern: /* # 💡[设计原理]拦截路径范围。 🗣️[生产建议]全量业务路径。
        session-stat-enable: false # 💡[设计原理]是否统计Session。 💪[性能语义]高并发场景关闭,避免额外内存与锁竞争。 🧬[默认值]true
        exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/monitor/db/druid/*" # 💡[设计原理]排除静态资源与Druid自身路径,避免循环统计。

      # ==============================================================================
      # 【八、 异常自愈与容错】
      # ==============================================================================
      break-after-acquire-failure: false # 💡[设计原理]获取连接失败是否直接终止。 🗣️[生产建议]设为false,允许短暂重试应对DB闪断。
      connection-error-retry-attempts: 3 # 💡[设计原理]连接失败重试次数。 🫵[生产规范]不宜过大,避免请求长时间堆积。
      time-between-connect-error-millis: 30000 # 💡[设计原理]连接失败后的重试间隔。 🗣️[生产建议]30s,为数据库恢复留出时间。

更多推荐