通过orawsv触发存储过程调用utl_http报ORA-29270错误如何解决
Oracle 11.2 使用orawsv调用含UTL_HTTP存储过程报错解决方案
以下为你遇到的报错信息:
ORA-06512: at "SYS.UTL_HTTP", line 1339 ORA-29261: bad argument
ORA-29273: HTTP request failed
ORA-06512: at "SYS.UTL_HTTP", line 1130
ORA-29270: too many open HTTP requests
该问题的核心原因是orawsv的会话采用池化复用机制,和直连数据库的会话生命周期逻辑不同:直连会话结束后会自动回收未释放的UTL_HTTP连接,而orawsv复用会话不会主动清理泄漏的HTTP连接,累积超出上限后就会触发上述报错;另外orawsv会话的权限上下文、参数配置和直连会话存在差异,也会引发参数校验失败。
可按以下步骤排查解决:
- 第一步:强制补充UTL_HTTP资源释放逻辑,无论请求成功或异常都要关闭连接,避免连接泄漏
参考代码模板:DECLARE req UTL_HTTP.REQ; resp UTL_HTTP.RESP; BEGIN req := UTL_HTTP.BEGIN_REQUEST('你的Web服务请求地址'); -- 此处为你原有请求头、传参设置逻辑 resp := UTL_HTTP.GET_RESPONSE(req); -- 此处为你原有响应解析逻辑 -- 正常流程关闭连接 UTL_HTTP.END_RESPONSE(resp); UTL_HTTP.END_REQUEST(req); EXCEPTION WHEN OTHERS THEN -- 异常分支强制释放资源,避免残留连接 IF UTL_HTTP.IS_OPEN(resp) THEN UTL_HTTP.END_RESPONSE(resp); END IF; IF UTL_HTTP.IS_OPEN(req) THEN UTL_HTTP.END_REQUEST(req); END IF; RAISE; END; / - 第二步:调整UTL_HTTP最大开放请求数上限,适配orawsv的复用会话场景
用DBA权限执行以下命令(数值可根据业务并发量调整,默认值通常为50):ALTER SYSTEM SET UTL_HTTP_MAX_OPEN_REQUESTS = 1000 SCOPE=BOTH; - 第三步:为orawsv访问用户配置独立的ACL网络权限,避免会话权限上下文差异
参考ACL配置代码:BEGIN DBMS_NETWORK_ACL_ADMIN.CREATE_ACL( acl => 'orawsv_http_access.xml', description => 'orawsv用户HTTP访问权限', principal => '你实际用于orawsv访问的数据库用户名', is_grant => TRUE, privilege => 'connect' ); DBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL( acl => 'orawsv_http_access.xml', host => '你要调用的Web服务域名或IP', lower_port => 80, -- 按需调整为你的服务端口 upper_port => 443 -- 按需调整为你的服务端口 ); COMMIT; END; / - 第四步:校验orawsv会话的字符集、NLS参数配置,确保和直连测试会话一致,避免编码异常引发
bad argument报错。
内容的提问来源于stack exchange,提问作者Mohamed Shaddad
相关产品推荐
相关产品推荐

