明明配置了Druid,Spring Boot 却总启动HikariCP?一文解决连接池冲突与监控配置
一、问题背景
在 Spring Boot 3 项目中,你使用了 mybatis-plus-spring-boot3-starter,并在 application.yml 中配置了 spring.datasource.druid 的各项参数。然而,应用启动后不久,却抛出了以下异常:
HikariPool-1 - Connection is not available, request timed out after 300ms
(total=10, active=...)
这个报错信息来自 com.zaxxer.hikari.pool.HikariPool,而你根本没有主动引入 HikariCP,这让人非常困惑。
二、根本原因分析
问题的本质在于:Spring Boot 的默认连接池是 HikariCP,而不是 Druid。
具体来说:
Spring Boot 的自动配置:只要项目中包含了 spring-boot-starter-jdbc 依赖(mybatis-plus-spring-boot3-starter 会传递引入),Spring Boot 就会自动配置一个数据源。
HikariCP 的优先级:当类路径下同时存在多个连接池(如 HikariCP、Druid、Tomcat JDBC 等)时,Spring Boot 会按优先级选择。HikariCP 拥有最高优先级,因此如果它存在于依赖中,就一定会被使用。
配置被忽略:尽管你写了 spring.datasource.druid 这样的 Druid 专属配置,但只要没有明确告诉 Spring Boot “请使用 Druid”,它就会无视这些配置,依然启动 HikariCP,并试图用 HikariCP 去连接数据库,最终因连接池参数不匹配(如 Druid 的参数对 HikariCP 无效)而触发超时错误。
简单概括:你的项目里 HikariCP 和 Druid 的 jar 包共存,而 Spring Boot“擅自”选择了前者。
三、解决方案:强制切换到 Druid
需要从依赖、配置两方面下手,彻底解决冲突。
步骤 1:添加正确的 Druid 依赖(Spring Boot 3 专用)
Spring Boot 3 全面迁移到了 Jakarta EE,必须使用适配 Jakarta 的 Druid Starter。在 pom.xml 中加入:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-3-starter</artifactId>
<version>1.2.23</version> <!-- 请使用最新稳定版 -->
</dependency>
这个 Starter 会自动处理好与 Spring Boot 3 的集成,无需再单独引入 druid 核心包。
步骤 2:修改配置文件,明确指定数据源类型
在 application.yml 中,关键一步是添加 spring.datasource.type,将数据源类型显式指定为 Druid:
spring:
datasource:
# 【核心】强制指定使用 Druid 数据源
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/your_db?useSSL=false&serverTimezone=UTC
username: root
password: your_password
# Druid 专属配置都放在这里
druid:
initial-size: 5
min-idle: 5
max-active: 20
max-wait: 60000
# 监控、过滤器等其他配置...
只要配置了 type,Spring Boot 就会强制使用 DruidDataSource,并会自动绑定 spring.datasource.druid 下的所有属性。
步骤 3:(可选,但推荐)彻底排除 HikariCP 依赖
虽然完成了前两步,项目已经能正常使用 Druid,但为了避免未来可能的混淆,建议在引入 mybatis-plus-spring-boot3-starter 时,直接排除它传递的 HikariCP:
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-spring-boot3-starter</artifactId>
<exclusions>
<exclusion>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
</exclusion>
</exclusions>
</dependency>
这样能让依赖关系更清晰,也确保 HikariCP 不会意外混入。
如何验证是否生效?
重启应用后,观察控制台启动日志。你应该能看到类似这样的信息:
o.s.jdbc.datasource.... : Loaded JDBC driver: com.alibaba.druid.pool.DruidDataSource
或者
o.s.b.a.jdbc.DataSourceAutoConfiguration : DataSource 'dataSource' is of type 'com.alibaba.druid.pool.DruidDataSource'
如果启用了 Druid 监控,还可以尝试访问监控页面 http://localhost:8080/druid/index.html,能正常打开就说明 Druid 已生效。
四、延伸:配置 Druid 内置监控页面
Druid 自带的监控功能非常实用,可以在应用内快速查看 SQL 执行情况、连接池状态等。配置起来也很简单。
基础配置示例
spring:
datasource:
druid:
# 开启 Web 关联监控(用于采集 web 请求和数据库操作的关系)
web-stat-filter:
enabled: true
url-pattern: "/*"
exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"
# 配置监控页访问
stat-view-servlet:
enabled: true # 启用监控页,默认 false
url-pattern: /druid/* # 访问路径,默认 /druid/*
login-username: admin # 登录用户名
login-password: admin123 # 登录密码
reset-enable: false # 是否允许页面重置统计数据(生产环境建议 false)
allow: 127.0.0.1 # IP 白名单(为空则允许所有)
# deny: 192.168.1.100 # IP 黑名单(优先级高于 allow)
配置完成后,访问 http://localhost:8080/druid 即可看到登录页,输入用户名密码就能进入监控 Dashboard。
特别提醒:Spring Boot 3.x 与 Spring Security 的兼容性
必须使用 druid-spring-boot-3-starter:老的 druid-spring-boot-starter 基于 javax.servlet,在 Spring Boot 3 中会直接报错。
如果集成了 Spring Security,需要放行 /druid/** 路径,否则会被拦截。示例配置:
http.authorizeHttpRequests(auth -> auth
.requestMatchers("/druid/**").permitAll() // 放行 Druid 监控
.anyRequest().authenticated()
);
五、常见问题排查
如果配置了 stat-view-servlet 但依然无法访问监控页(404),可以按以下顺序排查:
检查 YAML 缩进:这是最容易出错的地方。spring.datasource.druid.stat-view-servlet 必须严格对齐,缩进错误会导致整个配置块失效。请务必比对上面的示例。
确认依赖正确:检查 pom.xml 或 gradle 中是否使用了 druid-spring-boot-3-starter,版本是否 ≥1.2.20。
检查 application.yml 是否被加载:故意在文件里写一个语法错误,启动看是否报错。如不报错,说明文件未被识别,检查文件名和位置(应是 src/main/resources/application.yml)。
查看启动日志:看是否有关于 Druid 的 @WebServlet 或 ServletRegistrationBean 的注册日志,确认 Servlet 是否被初始化。
防火墙/反向代理:确保你没有通过 Nginx 等反向代理拦截对 /druid 路径的访问。
六、总结
这个问题的核心在于:Spring Boot 的默认连接池优先级高于你为 Druid 写的配置。解决方式简单明了:显式指定 spring.datasource.type=com.alibaba.druid.pool.DruidDataSource。
养成良好的依赖管理习惯,使用专为 Spring Boot 3 设计的 Starter,并及时排除不需要的传递性依赖,能避免很多莫名其妙的冲突。Druid 的监控页面也为应用健康检查提供了很大便利,建议在开发测试环境开启。
更多推荐


所有评论(0)