无法捕获PL / SQL异常处理程序中的transfer_timeout错误

时间:2015-08-19 07:31:41

标签: oracle plsql

我将超时设置为2秒,但代码运行了一分钟,然后转到@Named("test") public class Test { @Inject @MyModelDB // Qualifier private EntityManager em = null; // A simple test of the datamodel... public Long numberOfProjects() { if (this.em != null) { return ((BigDecimal) this.em.createNativeQuery("select count(*) from e_bo_projects").getSingleResult()).longValue(); } return -1L; } } 而不是when others

when UTL_HTTP.transer_timeout

为什么没有捕获超时?

1 个答案:

答案 0 :(得分:3)

您正在获得连接超时而不是传输超时。它来自BEGIN_REQUEST,而不是GET_RESPONSE;它没有转移任何东西,它只是试图打开到远程主机和端口的连接。如果您有一个连接以及请求/响应超过2秒的GET或POST,那么您会看到UTL_HTTP.transfer_timeout。但是你看到的是传输层问题,而不是HTTP请求问题。

您可以捕获'HTTP失败'部分,但不是特定的TNS超时,因为它由UTL_HTTP处理:

DECLARE
   ...
   http_failure exception;
   pragma exception_init(http_failure, -29273);
BEGIN
   ...
EXCEPTION
   WHEN UTL_HTTP.transfer_timeout
   THEN
      DBMS_OUTPUT.put_line ('Transfer timeout');
   WHEN http_failure
   THEN
      DBMS_OUTPUT.put_line ('HTTP failure - timeout?');
      RAISE;
END;

当你看到并查出更具体的错误时,你可以深入了解异常堆栈,但是不清楚你想要对具体原因做什么。大概你真的不想抓住这一切,你只是调试异常,为什么你设置的超时不起作用......

我不知道有什么方法可以改变超时的长度。因为它来自TNS,它看起来应该受sqlnet.outbound_connect_timeout的影响,但你在sqlnet.ora中设置了它,并且服务器在这种情况下似乎没有注意到它。它可能使用操作系统默认值。