connection-timeout指应用线程从连接池获取可用连接的最大等待时间,超时抛SQLException;它与JDBC URL的connectTimeout(TCP建连超时)无关,前者是连接池层排队等待上限,后者是驱动层建连动作超时。

Java 数据库连接池的 connection-timeout(注意不是 JDBC URL 中的 connectTimeout)指的是:应用线程从连接池中获取一个可用连接时,最多愿意等待的时间。超时未拿到连接,就会抛出 SQLException 或 HikariPool$PoolInitializationException 等异常,而不是无限卡住。
connection-timeout 是连接池层面的参数
它和 JDBC URL 里的 connectTimeout(建立 TCP 连接耗时)完全不是一回事:
- connection-timeout:池内无空闲连接、且无法新建(已达最大数)时,线程排队等待的上限;单位毫秒;由连接池自身控制;
-
connectTimeout:JDBC 驱动尝试与 MySQL 建立 TCP 连接时的超时;写在 URL 后面,如
?connectTimeout=3000;影响的是“建连动作”,不是“取连接动作”。
不同连接池的配置方式
以主流连接池为例,写法略有差异,但语义一致:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
-
HikariCP(Spring Boot 默认):
spring.datasource.hikari.connection-timeout=20000(单位毫秒,推荐 10~30 秒) -
Druid:
spring.datasource.druid.max-wait=20000(旧版叫 maxWait,单位毫秒)
或新版用spring.datasource.druid.connection-timeout=20000 -
DBCP2:
spring.datasource.dbcp2.max-wait-millis=20000
设置时要注意的关键点
这个值不能随意设大,否则会掩盖真实瓶颈:
立即学习“Java免费学习笔记(深入)”;
- 若业务并发突增,而
maximum-pool-size太小,大量线程会在 connection-timeout 内排队——这时真正该调的是最大连接数,不是延长等待时间; - 设为 0 表示无限等待(不推荐),容易导致线程堆积、线程池打满、接口雪崩;
- 建议略大于平均 SQL 执行耗时的 2~3 倍,例如慢查询 P95 是 800ms,可设为 3000~5000ms;
- 配合监控看
hikaricp.pool.wait指标,持续偏高说明 connection-timeout 经常被触发,需排查连接泄漏或池大小不足。
别和 JDBC URL 参数混淆
URL 中的超时参数是驱动层行为,必须显式加上才生效:
jdbc:mysql://host:3306/db?connectTimeout=3000&socketTimeout=30000- 这两个参数不会替代 connection-timeout,也不会被连接池自动读取;它们只在真正创建新连接(非复用)时起作用;
- 缺省时 connectTimeout 可能长达 30 秒甚至无限,导致连接池初始化卡死,所以务必显式配置。

















