cf2012.github.io

page

Follow me on GitHub

处理 Alibaba Druid 链接池15分钟超时问题

问题

一个在线系统遇到一个奇怪的问题.有些请求耗时长达15分钟. 甚至还有些耗时超过30分钟. 通过APM工具分析该请求,发现在测试DB连接是否有效时会等待15分钟,然后报错:

PSQLException: An I/O error occured while sending to the backend

原因分析

为什么会报这个错误?

根据报错信息在stackoverflow上搜索到了原因: 连接长时间未使用已经失效了. refer-1

连接为什么会失效?

失效的原因可能的原因为: 连接长时间空闲. 被防火墙或者交换机等网络设备切断了. refer-2

为什么长时间空闲?

系统每天请求量太低,一天不超过150笔 😓

程序里有个 配置: testWhileIdle, 空闲时会测试连接是否有效. 当连接长时间不使用,会被网络设备切断. 此时程序没有感知到.

n秒后,用户发过来一个请求. 连接池拿到连接后,测试一下连接是否有效. 该连接已经被切断了,导致连接不到DB ,经过15分钟后,被操作系统判定socket连接超时. 最终, jdbc驱动报错:

An I/O error occured while sending to the backend

解决方法

设置参数: validationQueryTimeout refer-3

参数含义如下: refer-5

validationQueryTimeout:
单位:秒,检测连接是否有效的超时时间。底层调用jdbc Statement对象的void setQueryTimeout(int seconds)方法

参考资料