一、问题背景

在 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 的监控页面也为应用健康检查提供了很大便利,建议在开发测试环境开启。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐