druid连接池初始化失败主因是依赖缺失或版本冲突,非spring项目需显式引入com.alibaba:druid(≥1.2.20),spring boot优先用druid-spring-boot-starter并配置spring.datasource.type;参数错配致卡死,maxtotal替代maxactive,maxwait须设正整数,testonborrow慎用;hikari默认覆盖druid,需显式指定type或加@primary;监控页404因servlet注册不当、allow未配置或security拦截,须正确注册statviewservlet并放行路径。

Druid连接池初始化失败:ClassNotFoundException 或 NoClassDefFoundError
常见于 Maven 依赖没对齐或版本冲突。Druid 不是 JDK 自带组件,必须显式引入;但很多人只加了 druid-spring-boot-starter,却在非 Spring 环境下手动 new DruidDataSource,结果类加载器找不到核心类。
- 纯 Java(非 Spring)项目,必须添加
com.alibaba:druid依赖,且版本建议选1.2.20及以上(修复了 JDK 17+ 的部分反射问题) - Spring Boot 2.7+ 项目,优先用
druid-spring-boot-starter,它会自动配置DruidDataSource,但需确认spring.datasource.type没被误设为com.zaxxer.hikari.HikariDataSource - 如果用了 Shading(如打包进 fat jar),检查
META-INF/MANIFEST.MF是否意外排除了druid相关包路径
配置项写错导致连接卡死:maxActive、maxWait、testOnBorrow 的实际影响
这些参数名字看着像“限制”,其实控制的是阻塞行为和健康检查时机,写错直接导致应用启动 hang 住、或运行中大量线程 WAITING 在 getConnection() 上。
-
maxActive(已废弃,应改用maxTotal):旧版 Druid 中若设为 0,池会无限创建连接,很快耗尽 DB 连接数;新版请统一用maxTotal -
maxWait默认 -1(无限等待),线上必须设为正整数(如3000),否则一个慢查询拖垮整个服务 -
testOnBorrow设为true时,每次取连接都执行validationQuery(如SELECT 1),高并发下 DB 压力翻倍;生产环境更推荐testWhileIdle+timeBetweenEvictionRunsMillis
Spring Boot 中 DruidDataSource 不生效:被 Hikari 覆盖
Spring Boot 2.x 默认内嵌 HikariCP,即使你写了 @Bean DruidDataSource,只要 spring.datasource.url 存在,Boot 仍会优先创建 Hikari 实例——你的 Bean 被忽略,日志里也几乎不报错。
- 确认
application.yml中是否含spring.datasource.type: com.alibaba.druid.pool.DruidDataSource - 检查是否有其他 starter(如
mybatis-spring-boot-starter)间接拉入 Hikari 依赖;可执行mvn dependency:tree | grep hikari验证 - 若手动定义
@Bean,务必加上@Primary注解,并确保该类不在@ComponentScan范围外
监控页面 404 或白屏:StatViewServlet 配置陷阱
Druid 内置的监控页(/druid)不是开箱即用,URL 映射、过滤器顺序、权限控制三者稍有偏差就返回 404 或空响应。
立即学习“Java免费学习笔记(深入)”;
- Servlet 注册必须用
ServletRegistrationBean(Spring Boot 1.x)或ServletWebServerFactoryCustomizer(2.x+),不能只靠@ServletComponentScan—— 后者在某些容器(如 Undertow)下不生效 -
allow参数默认为空,意味着拒绝所有 IP;需显式设为allow: 127.0.0.1,192.168.1.0/24,否则连本地都打不开 - 若项目用了 Spring Security,需放行
/druid/**路径,且确保DruidWebStatFilter在 SecurityFilterChain 之前注册
Druid 的配置自由度高,但每个开关背后都有明确的线程模型和资源生命周期约束。最容易被忽略的是连接泄漏检测(removeAbandonedOnBorrow 已废弃,必须用 removeAbandonedOnMaintenance + removeAbandonedTimeoutMillis)和日志级别——druid.stat.mergeSql=true 开启后,慢 SQL 日志才真正可用。











