Alibaba Druid 数据库连接池 takeLast() AQS 死锁导致程序无响应

Alibaba Druid 数据库连接池 takeLast() AQS 死锁导致程序无响应

💡 原文中文,约1200字,阅读约需3分钟。
📝

内容提要

项目现场同事发现应用不定期卡死,堆栈信息显示大部分线程在等待,是因为maxWait参数未配置。配置maxWait后问题解决。

🔎

延伸解读

maxWait 默认值 -1 的潜在风险

Druid 的 maxWait 参数默认值为 -1,表示从连接池获取连接时若池中无可用连接,线程会无限期等待。这种设计在连接耗尽时会导致所有请求线程阻塞在 takeLast() 方法,进而使应用无响应。因此,即使未显式配置,也需意识到默认行为可能引发严重故障。

配置 maxWait 的实践意义

配置 maxWait 后,当连接池无可用连接时,获取连接的线程会在超时后抛出异常,而不是永久等待。这能避免线程堆积导致应用卡死,同时让问题以错误形式暴露,便于监控和排查。建议根据业务容忍度设置合理的超时时间,并确保有相应的异常处理机制。

版本差异与后续关注

文章指出 Druid 最新版本中 maxWait 的处理方式已有修改,并提供了 2024 年 1 月的提交链接。这意味着不同版本的行为可能不同,升级时需留意变更。建议持续关注官方更新,并在测试环境中验证连接池配置,以确保与当前版本兼容。

❓

Q&A

Alibaba Druid 连接池导致应用卡死无响应的原因是什么?

原因是未配置 maxWait 参数,导致线程在 com.alibaba.druid.pool.DruidDataSource.takeLast() 方法中无限等待连接。

如何解决 Druid 连接池导致的程序无响应问题?

在 Alibaba Druid 配置文件中配置 maxWait 参数即可解决。

Druid 的 maxWait 参数默认值是多少?代表什么含义?

maxWait 参数默认值是 -1,表示从连接池获取连接时会一直等待下去,没有超时时间。

maxWait 参数的作用是什么?

maxWait 是从连接池中获取连接的最大等待时间,单位毫秒。

Druid 在哪个版本中修改了 maxWait 的处理方式?

在 2024 年 1 月 23 日的一个提交中修改了 maxWait 的处理方式,具体版本未明确,但建议关注最新版本。

Druid 连接池中 takeLast() 方法在什么情况下被调用?

当 maxWait 不大于 0 时,会执行 takeLast() 方法,导致线程无限等待。

🏷️

标签

➡️

继续阅读