1. Druid连接池在SpringBoot中的核心价值在Java企业级应用开发中数据库连接池是影响系统性能的关键组件。Druid作为阿里巴巴开源的数据库连接池实现相比传统的HikariCP、C3P0等方案最大的差异化优势在于其内置的监控功能。通过druid-spring-boot-starter这个官方适配器开发者可以零配置实现实时SQL监控包括执行次数、耗时分布连接泄露检测开发阶段快速定位未关闭的连接WallFilter防御SQL注入企业级安全防护统计URI请求耗时Web应用场景特别有用我最近在金融级系统中实测发现同样的查询场景下Druid连接池配合监控配置后能提前发现90%以上的慢SQL问题。下面通过具体配置示例展示如何最大化利用这个组件。2. 环境准备与基础配置2.1 依赖引入要点在pom.xml中需要同时引入starter和监控页面依赖dependency groupIdcom.alibaba/groupId artifactIddruid-spring-boot-starter/artifactId version1.2.18/version /dependency dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-actuator/artifactId /dependency注意很多教程会遗漏actuator依赖导致/druid监控页面无法正常显示统计图表2.2 YML配置精要application.yml中建议采用分层配置结构spring: datasource: type: com.alibaba.druid.pool.DruidDataSource druid: # 连接池核心参数 initial-size: 5 max-active: 20 min-idle: 5 max-wait: 60000 # 监控专用配置 stat-view-servlet: enabled: true login-username: admin login-password: 123456 reset-enable: false web-stat-filter: enabled: true exclusions: *.js,*.gif,*.jpg,/druid/*关键参数说明max-active需要根据数据库max_connections调整建议设置为数据库最大连接的70%max-wait单位是毫秒高并发场景建议适当调大stat-view-servlet控制监控页面的访问权限生产环境必须配置账号密码3. 高级功能实战3.1 SQL防火墙配置在金融系统中防止SQL注入尤为重要。Druid的WallFilter可以这样启用Configuration public class DruidConfig { Bean public FilterRegistrationBeanWebStatFilter webStatFilter(){ FilterRegistrationBeanWebStatFilter bean new FilterRegistrationBean(); bean.setFilter(new WebStatFilter()); bean.addInitParameter(exclusions, *.js,*.gif,*.jpg,/druid/*); return bean; } Bean public WallFilter wallFilter(){ WallFilter wallFilter new WallFilter(); wallFilter.setConfig(wallConfig()); return wallFilter; } Bean public WallConfig wallConfig(){ WallConfig config new WallConfig(); config.setDropTableAllow(false); //禁止删表 config.setTruncateAllow(false); //禁止清空表 return config; } }3.2 多数据源监控对于分库分表场景需要为每个数据源单独配置监控Primary Bean(name masterDataSource) ConfigurationProperties(spring.datasource.druid.master) public DataSource masterDataSource(){ return DruidDataSourceBuilder.create().build(); } Bean(name slaveDataSource) ConfigurationProperties(spring.datasource.druid.slave) public DataSource slaveDataSource(){ return DruidDataSourceBuilder.create().build(); } Bean public DynamicDataSource dynamicDataSource( Qualifier(masterDataSource) DataSource master, Qualifier(slaveDataSource) DataSource slave) { MapObject, Object targetDataSources new HashMap(); targetDataSources.put(master, master); targetDataSources.put(slave, slave); return new DynamicDataSource(master, targetDataSources); }4. 生产环境调优指南4.1 连接泄露检测在开发环境建议开启spring: datasource: druid: remove-abandoned: true remove-abandoned-timeout: 1800 # 30分钟未关闭的连接强制回收 log-abandoned: true # 打印泄露日志4.2 监控指标对接Prometheus通过自定义Endpoint暴露指标Endpoint(id druid) Component public class DruidEndpoint { ReadOperation public MapString, Object druid() { MapString, Object result new HashMap(); for (DataSource dataSource : DataSourceManager.getDruidDataSources()) { DruidDataSource druidDataSource (DruidDataSource) dataSource; result.put(activeCount, druidDataSource.getActiveCount()); result.put(poolingCount, druidDataSource.getPoolingCount()); // 其他关键指标... } return result; } }5. 常见问题排查5.1 监控页面404问题检查项是否添加了spring-boot-starter-web依赖检查stat-view-servlet.enabled是否为true确认没有自定义的ServletRegistrationBean覆盖默认配置5.2 连接池初始化失败典型错误日志Failed to bind properties under spring.datasource.druid to com.alibaba.druid.pool.DruidDataSource解决方案检查JDBC URL格式时间参数需要转义确认数据库驱动版本匹配尝试在URL后添加useSSLfalseserverTimezoneUTC5.3 监控数据不更新可能原因没有配置web-stat-filter前端页面缓存问题强制刷新或清空缓存系统时间不同步影响统计图表显示我在实际项目中遇到过最隐蔽的问题是Nginx反向代理配置了proxy_pass但遗漏了proxy_set_header Host $host;导致监控页面的AJAX请求路径错误。这类问题需要抓包分析请求链路。