druid连接池初始化失败主因是依赖不齐或配置早于bean初始化;需用druid-spring-boot-starter、正确配置spring.datasource.druid前缀、设置唯一name及维护周期。

Druid 连接池初始化失败:com.alibaba.druid.pool.DruidDataSource 报 NoClassDefFoundError 或空指针
根本原因往往是依赖没对齐或配置早于 Bean 初始化。Druid 的 DruidDataSource 是一个普通 Java 对象,但它的监控、Filter、属性绑定都依赖 Spring 容器后期处理(比如 DruidDataSourceFactoryBean 或自动配置类)。Spring Boot 2.3+ 默认不再自动装配 Druid,必须显式引入 starter。
- 确认
pom.xml中同时存在:druid-spring-boot-starter(推荐)或druid+ 手动配置@Configuration - 避免混用
druid原生 jar 和旧版druid-spring-boot-starter(如 1.1.x),它们的包路径和初始化逻辑不兼容 - 若手动 new
DruidDataSource(),务必调用init(),否则所有连接参数(包括url、username)只是 setter,不会生效
application.yml 中 spring.datasource.druid 配置项不生效
Spring Boot 自动配置只识别特定前缀。Druid starter 的配置入口是 spring.datasource.druid,但很多关键参数(如过滤器、监控开关)必须写在该层级下,不能错放到 spring.datasource 根级或自定义前缀里。
-
spring.datasource.url是 JDBC 连接串,spring.datasource.druid.url是无效的——Druid 复用前者,自己只管池行为 - 启用 SQL 监控需配:
spring.datasource.druid.web-stat-filter.enabled=true和spring.datasource.druid.stat-view-servlet.enabled=true,缺一不可 - 密码加密时,
spring.datasource.druid.filters=config必须存在,且spring.datasource.druid.connection-properties=config.decrypt=true
Druid 连接泄漏检测(removeAbandonedOnBorrow 已废弃)
1.2.16+ 版本中,removeAbandonedOnBorrow、removeAbandonedTimeoutMillis 全部被移除,改用新机制:removeAbandonedOnMaintenance + removeAbandonedTimeoutMillis + 定期维护触发。
- 必须开启维护线程:
spring.datasource.druid.remove-abandoned-on-maintenance=true -
spring.datasource.druid.time-between-eviction-runs-millis要设为合理值(如 60000),否则维护不触发,泄漏检测形同虚设 - 泄漏日志默认输出到控制台,若用 logback,需确保
com.alibaba.druid.pool.DruidDataSource日志级别为warn或更低
多数据源场景下,Druid 的 DruidStatManagerFacade 返回 null 或统计错乱
DruidStatManagerFacade 是单例,它内部靠 JMX ObjectName 区分数据源。如果多个 DruidDataSource 实例未设置唯一 name,或者使用了相同 name,就会覆盖彼此的监控数据。
立即学习“Java免费学习笔记(深入)”;
- 每个数据源 Bean 必须显式调用
setName("ds-primary")(代码方式)或配置spring.datasource.druid.name=ds-primary(YAML 方式) - Spring Boot 多数据源自动配置时,
@Primary数据源默认 name 为dataSource,其余需手动指定,否则监控页只显示第一个 - 通过
DruidStatManagerFacade.getInstance().getDataSourceStat("ds-primary")获取统计,传入的 name 必须与 set 的完全一致(区分大小写)










