1、BUG详情:Druid擅自设置10秒默认超时
问题根源
从Druid官方1.2.22版本的Release Notes中可以明确看到:
优化超时设置默认逻辑。针对 1.2.12开始的connectTimeout和socketTimeout在没指定配置的情况下默认为10秒情况,去除该默认逻辑。在没配置这两个参数的情况下,超时设置行为与以前保持一致。去除timeout默认值为10秒的逻辑 #5729 #5735
版本行为对照表
| 版本范围 | socketTimeout默认行为 | 慢查询表现 |
|---|---|---|
| 1.2.11及更早 | 无默认值(遵循JDBC驱动默认值0,无限等待) | 30秒查询正常返回 |
| 1.2.12 - 1.2.21 | 强制设为10秒(无论是否配置) | 10秒准时报错 |
| 1.2.22及以后 | 恢复旧版行为,无默认10秒限制 | 正常执行 |
Druid官方为何要加这个默认限制?
官方解释是:新增默认connectTimeout(10秒)和socketTimeout(10秒),用于减少网络丢包时连接池无法创建连接的问题,提升连接池健壮性。
这本质是"防御性配置",但忽略了长耗时SQL(如统计分析、批量处理)的场景。
2、解决方案
方案1:升级Druid版本(推荐)
直接升级到1.2.22或更高版本,BUG已被修复:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.28</version> <!-- 使用最新稳定版 -->
</dependency>
方案2:显式配置超时时间(不升级版本)
如果暂时无法升级,必须显式配置这两个参数:
spring:
datasource:
druid:
connect-timeout: 60000 # 60秒,单位毫秒
socket-timeout: 60000 # 60秒,单位毫秒
3、验证方法
配置后可通过以下方式验证是否生效:
-
查看Druid监控页面:数据源 -> 连接属性,确认socketTimeout值
-
测试慢查询 :执行
SELECT SLEEP(15),应能正常返回而不再报错