ORA-24247使用utl_http.read_text时。仅在延迟约60秒后出现

时间:2013-11-29 16:52:29

标签: oracle oracle11g ora-24247

我使用以下代码来读取http请求的响应:

      FUNCTION readClob (ww_reponse IN OUT NOCOPY UTL_HTTP.resp)
        RETURN CLOB
      IS
        l_clob   CLOB;
        l_text   VARCHAR2 (32767);
      BEGIN
        DBMS_LOB.createtemporary (l_clob, FALSE);
        BEGIN
          LOOP
=>          UTL_HTTP.read_text (ww_reponse, l_text, 32767);
            DBMS_LOB.writeappend (l_clob, LENGTH (l_text), l_text);
          END LOOP;
        EXCEPTION
          WHEN UTL_HTTP.end_of_body
          THEN
            UTL_HTTP.end_response (ww_reponse);
        END;

这适用于小型请求,但是对于较长的请求(大约> 60秒),我在network access denied by access control list (ACL)指令上收到ORA-24247错误(read_text),但令我惊讶的是不是在第一次通话,而是在一些随机的下一次迭代,大约60秒后。我的ACL没问题,否则什么都行不通。 我也设置了更大的超时。显然错误不是“真正的”错误。有人有同样的问题和解决方案吗?谢谢。

环境:     Windows Server 2008上的Oracle Database 11g企业版(64位)

1 个答案:

答案 0 :(得分:0)

我终于去了Oracle支持,发现了这个: 删除并重新创建ACL,如下所示

BEGIN 
  DBMS_NETWORK_ACL_ADMIN.CREATE_ACL( 
  acl => 'wallet-acl.xml', 
  description => 'Wallet ACL', 
  principal => 'APPS', 
  is_grant => TRUE, 
  privilege => 'use-client-certificates'); 

  DBMS_NETWORK_ACL_ADMIN.ADD_PRIVILEGE( 
  acl => 'wallet-acl.xml', 
  principal => 'APPS', 
  is_grant => TRUE, 
  privilege => 'use-passwords'); 

  DBMS_NETWORK_ACL_ADMIN.ASSIGN_WALLET_ACL( 
  acl => 'wallet-acl.xml', 
  wallet_path => 'file:'); 
 END; 
 /

然后我得到的消息已损坏(错过了一些字符)。

我在循环中添加了睡眠指令,现在一切都很好。不是真正的解决方案,而是最好的解决方法。

      FUNCTION readClob (ww_reponse IN OUT NOCOPY UTL_HTTP.resp)
        RETURN CLOB
      IS
        l_clob   CLOB;
        l_text   VARCHAR2 (32767);
      BEGIN
        DBMS_LOB.createtemporary (l_clob, FALSE);
        BEGIN
          LOOP
            UTL_HTTP.read_text (ww_reponse, l_text, 32767);
=>          **dbms_lock.sleep(0.1);**
            DBMS_LOB.writeappend (l_clob, LENGTH (l_text), l_text);
          END LOOP;
        EXCEPTION
          WHEN UTL_HTTP.end_of_body
          THEN
            UTL_HTTP.end_response (ww_reponse);
        END;