数据库连接池的性能和稳定性直接影响应用的响应速度。Spring Boot默认使用HikariCP,虽然性能不错,但缺少开箱即用的SQL监控和统计能力。Druid是阿里巴巴开源的数据库连接池,除了连接池基础功能,还内置了强大的监控统计组件,能够通过Web页面直观展示SQL执行情况、连接池状态和慢查询记录。对于需要排查慢SQL、观察连接泄漏或统计访问频率的项目,整合Druid可以显著提升可观测性。

整合Druid本身并不复杂,核心工作分为两步:把数据源切换到DruidDataSource,然后注册监控相关的Servlet和Filter。下面从依赖配置开始,逐步完成整个整合过程,并给出常用参数说明。
一、依赖引入与基础数据源配置
以Maven项目为例,引入Druid官方提供的Spring Boot Starter是最省事的方式。Starter会自动完成数据源初始化、监控参数绑定以及Servlet和Filter的自动装配,避免手写大量配置类。在pom.xml中加入以下依赖:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.20</version>
</dependency>
如果不想使用Starter,也可以只引入druid核心包,然后通过@Bean手动创建DruidDataSource,再注册监控组件。两种方式本质上一样,只是Starter把很多重复步骤收敛到了自动配置里。对于新项目,推荐使用Starter;如果已有项目对自动配置有特殊要求,手动配置会更灵活。
接着在application.yml中配置数据源。需要把spring.datasource.type显式指定为com.alibaba.druid.pool.DruidDataSource,这样Spring Boot会使用Druid连接池替代默认的HikariCP。基础配置如下:
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
url: jdbc:mysql://localhost:3306/test_db?useSSL=false&serverTimezone=UTC
username: root
password: your_password
driver-class-name: com.mysql.cj.jdbc.Driver
druid:
initial-size: 5
min-idle: 5
max-active: 20
max-wait: 60000
这里的initial-size表示初始化连接数,min-idle是最小空闲连接数,max-active是最大活跃连接数,max-wait是获取连接时的最大等待毫秒数。这些参数需要根据业务并发量调整,不宜设置过大,否则会占用过多数据库会话资源。配置完成后,启动应用时控制台通常会打印DruidDataSource的相关初始化信息。
二、注册监控Servlet与Filter并开启统计
Druid的监控界面由StatViewServlet提供,Web请求统计由WebStatFilter负责采集。使用Starter时,可以在application.yml中通过spring.datasource.druid.stat-view-servlet和spring.datasource.druid.web-stat-filter一键开启。例如:
spring:
datasource:
druid:
stat-view-servlet:
enabled: true
url-pattern: /druid/*
login-username: admin
login-password: admin123
allow: 127.0.0.1
deny: 192.168.10.1
web-stat-filter:
enabled: true
url-pattern: /*
exclusions: '*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*'
如果采用手动配置,则需要创建ServletRegistrationBean和FilterRegistrationBean两个Bean。这种写法在旧版本Spring Boot或不想引入Starter的场景中更常用。下面是一个完整的Java配置类:
import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
@Configuration
public class DruidConfig {
@Bean
public ServletRegistrationBean statViewServlet() {
ServletRegistrationBean bean = new ServletRegistrationBean(new StatViewServlet(), "/druid/*");
Map<String, String> initParams = new HashMap<>();
initParams.put("loginUsername", "admin");
initParams.put("loginPassword", "admin123");
initParams.put("allow", "127.0.0.1");
initParams.put("deny", "192.168.10.1");
bean.setInitParameters(initParams);
return bean;
}
@Bean
public FilterRegistrationBean webStatFilter() {
FilterRegistrationBean bean = new FilterRegistrationBean();
bean.setFilter(new WebStatFilter());
Map<String, String> initParams = new HashMap<>();
initParams.put("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
bean.setInitParameters(initParams);
bean.setUrlPatterns(Arrays.asList("/*"));
return bean;
}
}
代码中ServletRegistrationBean负责将StatViewServlet映射到/druid/*路径,loginUsername和loginPassword是监控页面登录账号,生产环境务必修改。allow用于IP白名单,多个IP用逗号分隔;deny用于黑名单,优先级高于白名单。WebStatFilter的exclusions参数可以排除静态资源,避免无意义的请求统计干扰数据。完成上述配置后,启动应用并访问http://localhost:8080/druid/login.html即可看到登录页。
三、监控界面核心指标与SQL分析
登录Druid监控页面后,首页会显示数据源名称、活跃连接数、连接池峰值、SQL执行总数等信息。这些指标能够快速判断连接池是否健康,例如当活跃连接数长时间接近maxActive时,说明并发请求已经逼近连接池上限,需要考虑扩容或优化SQL执行时间。如果连接数出现周期性骤增骤减,可能意味着连接泄漏或者批量任务处理不当。
SQL监控页面列出了所有执行过的SQL语句,包括执行次数、每次执行的平均耗时、最慢耗时、错误数等。通过点击某条SQL,可以查看详细的执行时间分布。慢SQL记录功能默认开启,当SQL执行时间超过slowSqlMillis配置的阈值(默认3000毫秒)时,会被单独记录到慢SQL列表中。这个功能在实际排查中非常实用,可以直接定位到拖慢接口的SQL。
除了SQL监控,Druid还提供Web应用监控和URI监控。Web应用监控展示当前Web应用的请求总数、请求时间分布;URI监控按接口路径聚合统计,能够看到哪些接口调用频繁、哪些接口耗时较高。对于前后端分离的项目,可以结合这些数据和SQL监控一起分析接口瓶颈。需要注意的是,监控界面展示的数据保存在内存中,默认不会持久化,应用重启后统计会清空。
四、生产环境安全与连接池参数调优
监控界面一旦暴露在公网,攻击者可能通过SQL统计获取表结构信息或推断业务逻辑。因此生产环境必须设置强密码,并且用allow参数限制只有内网IP或指定运维机器可以访问。建议不要把resetEnable参数设置为true,否则任何人都能通过URL重置监控数据。Druid还支持loginUsername和loginPassword以外的安全配置,例如结合Spring Security对/druid/*路径做二次认证。
连接池参数调优需要结合数据库性能和服务承载能力。常见参数包括:initialSize初始化连接数,minIdle最小空闲连接,maxActive最大活跃连接,maxWait获取连接超时,timeBetweenEvictionRunsMillis检查空闲连接的间隔,minEvictableIdleTimeMillis连接空闲多长时间后回收。对于MySQL,建议配置validationQuery为SELECT 1,并开启testWhileIdle和testOnBorrow,避免获取到已经断开的连接。
另外,Druid内置了WallFilter用于SQL防火墙,能够拦截危险SQL和防止SQL注入。在配置类中可以通过setProxyFilters添加WallFilter实例,并设置dbType为对应数据库类型。生产中建议开启WallFilter,并定期查看拦截日志。对于慢SQL阈值,可以根据业务容忍度调整slowSqlMillis,比如设为1000毫秒,但不要设置过小,否则正常查询也会被记录,反而增加噪声。
五、整合过程中常见问题
第一个常见问题是访问监控页面时出现404。这通常是因为ServletRegistrationBean没有被扫描到,或者Starter版本与Spring Boot版本不兼容。检查配置类是否位于Spring Boot主类的包扫描路径下,并确认druid-spring-boot-starter版本与Spring Boot版本匹配。另一个常见问题是登录后页面能打开,但SQL监控没有数据。此时需要确认WebStatFilter是否注册成功,以及exclusions是否误排除了业务接口。
第二个问题是使用多个数据源时,Druid监控只统计到默认数据源。这是因为自动配置只针对@Primary数据源生效。多数据源场景下需要手动为每个数据源配置独立的DruidDataSource,并且分别注册对应的监控Servlet和Filter。还有一种情况是应用启动时提示maxActive设置无效,这可能是因为配置文件中的属性名错误,例如写成了max-active-size而不是max-active。
如果监控页面显示的空闲连接数一直为0,可以先检查数据库连接是否被正确释放。在代码中使用连接后必须调用close方法归还连接;如果使用Spring的事务管理,事务结束后连接会自动归还。否则连接会一直被占用,最终导致连接池耗尽。通过Druid监控的连接池页面可以直接观察到连接创建和销毁的时间点,帮助定位连接泄漏问题。
Spring Boot整合DruidDruid数据库连接池Druid监控界面修改时间:2026-09-26 13:22:43