部署在Heroku的应用近24小时无法建立DB2连接报SQL30081N错误
排查思路
核心错误定位
日志中的SQL30081N错误码115代表TCP连接超时,H12是Heroku平台标准的请求30秒无响应报错。本地可以正常连接DB2说明数据库本身服务正常,问题出在Heroku运行环境到DB2的链路、或者应用侧的连接配置异常。
分步排查方案
- 第一步:验证网络连通性
直接执行heroku run bash进入应用的运行时容器,用nc或telnet命令测试DB2的服务IP和端口是否能连通:
如果无法连通,基本可以确定是网络层面问题:大概率是DB2侧的防火墙白名单未包含Heroku最新的出口IP段(Heroku dyno出口IP不固定,平台会定期更新IP段),或者DB2侧网络策略有调整。nc -zv <DB2_IP> <DB2_PORT> - 第二步:排查近期配置/部署变动
检查近24小时内是否有代码部署、依赖升级、Heroku环境变量修改操作:- 确认
node-ibm_db依赖版本是否有变动,是否修改了DB2连接字符串的参数 - 检查Heroku Config Vars中存储的DB连接地址、端口、认证信息是否被误改
- 如有变动先回滚到上一个正常运行的部署版本,验证是否能恢复服务
- 确认
- 第三步:检查连接池配置有效性
连接池长时间运行后可能出现僵死连接,或者DB2侧调整了空闲连接超时时间,导致应用复用已被服务端断开的连接:- 先手动重启所有dyno,验证重启后是否能正常连接DB2,如重启恢复即可确认是连接池问题
- 后续优化连接池配置,增加连接有效性检测逻辑:开启
testOnBorrow参数,配置validationQuery为SELECT 1 FROM SYSIBM.SYSDUMMY1,每次从连接池取连接时先验证可用性,同时设置合理的最大空闲连接时间,避免复用过期连接
- 第四步:验证SSL/TLS证书有效性
如果DB2开启了SSL连接,检查应用打包的DB2根证书是否过期,或者Heroku运行环境的根证书存储是否有更新:本地证书是最新的所以可正常连接,dyno环境中的证书不匹配会导致连接握手失败超时。
对应解决方案
- 如为IP白名单问题:可购买Heroku固定IP类附加组件,将固定IP加入DB2白名单;或者将Heroku官方公布的全量出口IP段加入DB2白名单
- 如为连接池问题:按上述步骤优化连接池配置即可
- 如为证书问题:将最新的DB2根证书打包到应用部署包,在连接配置中显式指定证书路径
内容的提问来源于stack exchange,提问作者gianlps
相关产品推荐
相关产品推荐

