WebSphere调用Oracle PL/SQL存储过程偶发连接关闭问题求助
偶发WebSphere调用Oracle存储过程连接关闭问题解决方案
故障背景
本次故障涉及的环境与现象如下:
- 应用栈:Java应用部署于IBM WebSphere,对接Oracle 11.2.0.4数据库
- 故障现象:调用PL/SQL存储过程偶发
DSRA9110E: Connection is closed报错,触发时间无固定规律,最短在调用后数分钟出现,最长可达2小时后触发 - 基准表现:存储过程正常执行耗时小于10秒,故障时大概率存在资源等待导致执行时长异常拉长
- 已排除项:Oracle官方Doc ID 2359390.1描述的JDBC 12.1.0.2版本Bug,该Bug触发时作业重跑必然失败,与本次偶发特征不符
完整报错日志
com.ibm.websphere.ce.cm.ObjectClosedException: DSRA9110E: Connection is closed. at com.ibm.ws.rsadapter.jdbc.WSJdbcWrapper.createClosedException(WSJdbcWrapper.java:122) at com.ibm.ws.rsadapter.jdbc.WSJdbcConnection.activate(WSJdbcConnection.java:2936) at com.ibm.ws.rsadapter.jdbc.WSJdbcConnection.setAutoCommit(WSJdbcConnection.java:3512)
核心诱因与修复方案
1. WebSphere数据源连接池回收机制触发
WebSphere数据源会主动回收长时间未返回池的连接,若故障时存储过程执行时长超过连接超时阈值,连接会被池化层主动关闭。
修复步骤:
- 检查数据源三个核心超时配置:
连接超时、不使用超时、废弃超时,确认阈值是否小于故障场景下存储过程实际执行时长 - 临时调大对应阈值,同时开启数据源连接池跟踪日志,确认连接回收的触发时机与触发逻辑
2. 网络层闲置连接被主动断开
防火墙、负载均衡等中间网络设备通常会对长时间无流量的TCP会话做主动清理,Oracle默认TCP保活间隔过长时,会被网络设备误认为闲置连接断开。
修复步骤:
- 排查应用服务器到数据库之间所有网络设备的会话超时配置,确保阈值大于业务允许的最长执行时间
- 调整应用服务器与数据库服务器的TCP keepalive参数,保活报文发送间隔设置为网络设备超时时间的3/4,避免连接被误杀
- 在JDBC连接串中添加
oracle.net.keepAlive=true参数,启用JDBC层的连接保活能力
3. 数据库侧会话被主动终止
数据库用户profile的闲置/连接时长限制、DBA手动Kill会话、实例级僵死会话回收逻辑都可能导致会话被主动关闭。
修复步骤:
- 检查应用用户对应的profile配置,确认
idle_time、connect_time参数是否设置过短 - 开启数据库会话审计,故障后查询
v$session、dba_audit_trail视图,定位会话终止的触发方与原因
4. 存储过程偶发资源等待/死锁
存储过程依赖的对象被其他大事务锁定、IO资源不足、归档日志写满等场景都会导致存储过程hang住,执行时长超过各层超时阈值最终连接被断开。
修复步骤:
- 故障发生时立即抓取AWR、ASH报告,定位当时的Top等待事件,确认是否存在锁等待、IO瓶颈等问题
- 给存储过程添加分步执行日志,定位卡住的具体逻辑节点,针对性优化SQL逻辑
内容的提问来源于stack exchange,提问作者STALOK
相关产品推荐
相关产品推荐

