基于Weblogic的Java Web调用Informix存储过程数据异常求助
问题排查与解决方案
一、存储过程层排查
- 首先确认存储过程事务边界与异常处理逻辑:你遇到的插入中断、后续请求全部异常、重启Weblogic后恢复的特征,高度符合部分执行失败+事务未正常提交的场景。Informix存储过程如果未显式配置异常捕获,插入table1数据时遇到唯一键冲突、字段长度超限、权限不足等问题会直接中断执行,仅保留前2条已自动提交的插入结果。
- 核对行数统计逻辑:检查判断
reporttable对应序列号行数的SQL是否存在过滤条件错误、变量赋值错误的问题,比如序列号变量被意外覆盖、统计时携带了额外的无效过滤条件,导致明明已经插入了2条有效数据却统计得到0行,触发NO DATA的插入逻辑。 - 临时增加存储过程异常埋点,定位具体报错原因:
-- 在存储过程开头增加异常捕获逻辑 DEFINE err_code INTEGER; DEFINE err_msg CHAR(255); ON EXCEPTION SET err_code, err_msg -- 把错误信息写入日志表方便排查 INSERT INTO proc_error_log(serial, err_code, err_msg, op_time) VALUES (input_serial, err_code, err_msg, CURRENT); END EXCEPTION;
- 确认事务隔离级别配置:如果存储过程使用
提交读及以上的隔离级别,插入table1的操作未提交时,后续行数统计逻辑看不到未提交的插入结果,也会触发NO DATA插入。
二、Weblogic与JDBC层排查
- 检查数据源配置的
Test Connections On Reserve开关是否开启:如果未开启,已经处于事务挂起、连接断开状态的坏连接会被连接池持续分配给业务请求,导致所有同类查询都触发异常,重启Weblogic后连接池重置所有连接就会恢复正常。 - 补全Java调用存储过程的事务与资源释放逻辑:你当前业务无异常捕获的情况很容易造成连接泄漏,JDBC连接未正常关闭、事务未显式提交/回滚都会导致事务长期挂起:
// 参考修正后的调用逻辑 Connection conn = null; CallableStatement cs = null; try { conn = dataSource.getConnection(); cs = conn.prepareCall("{call your_report_proc(?)}"); cs.setString(1, serial); cs.execute(); conn.commit(); // 显式提交事务 } catch (SQLException e) { if(conn != null) { try {conn.rollback();} catch (SQLException ex) {} } // 打印异常日志到业务日志文件 } finally { // 强制关闭资源避免连接泄漏 if(cs != null) try {cs.close();} catch (SQLException e) {} if(conn != null) try {conn.close();} catch (SQLException e) {} }
- 临时规避可以配置Weblogic数据源的
Inactive Connection Timeout为300秒,超过时长自动回收未释放的异常连接,避免坏连接长期占用连接池。
三、问题复现验证方案
问题出现时先不要重启Weblogic,优先做两个排查动作:
- 用Informix命令
onstat -g sql查看当前活跃的数据库会话,确认对应序列号的插入操作是否处于锁等待、挂起状态 - 查看Weblogic数据源监控面板,确认是否有连接的活跃时长远超正常查询的耗时范围
内容的提问来源于stack exchange,提问作者Wang Hsiang Hsiang
相关产品推荐
相关产品推荐

