SpringBoot连接池配置:Druid属性,Druid配置;Druid监控控制台;Druid SQL监控;Druid Web URL监控;Druid Spring方法监控;Druid连接池完整配置
SpringBoot连接池配置:Druid属性,Druid配置;Druid监控控制台;Druid SQL监控;Druid Web URL监控;Druid Spring方法监控;Druid连接池完整配置置
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 的方式:
- 通过
filters属性配置 - 通过
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类名 | 别名(全限定类名) |
|---|---|
| default | com.alibaba.druid.filter.stat.StatFilter |
| stat | com.alibaba.druid.filter.stat.StatFilter |
| mergeStat | com.alibaba.druid.filter.stat.MergeStatFilter |
| encoding | com.alibaba.druid.filter.encoding.EncodingConvertFilter |
| log4j | com.alibaba.druid.filter.logging.Log4jFilter |
| log4j2 | com.alibaba.druid.filter.logging.Log4j2Filter |
| slf4j | com.alibaba.druid.filter.logging.Slf4jLogFilter |
| commonlogging | com.alibaba.druid.filter.logging.CommonsLogFilter |
| wall | com.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 名称 | 实现类 | 说明 |
|---|---|---|
| Log4jFilter | com.alibaba.druid.filter.logging.Log4jFilter | 使用 Log4j 输出 SQL 执行日志。 |
| Log4j2Filter | com.alibaba.druid.filter.logging.Log4j2Filter | 使用 Log4j2 输出 SQL 日志,更适合现代项目。 |
| CommonsLogFilter | com.alibaba.druid.filter.logging.CommonsLogFilter | 使用 Apache Commons Logging 输出 SQL 日志。 |
| Slf4jLogFilter | com.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,为数据库恢复留出时间。
更多推荐


所有评论(0)