java.sql.SQLException:Io 异常:套接字读取超时与关闭连接

Posted

技术标签:

【中文标题】java.sql.SQLException:Io 异常:套接字读取超时与关闭连接【英文标题】:java.sql.SQLException: Io exception: Socket read timed out vs Closed Connection 【发布时间】:2013-05-16 18:10:59 【问题描述】:

我正在尝试针对以下两个连接到 Oracle DB 的错误来研究这个问题:

    关闭连接 java.sql.SQLException:Io 异常:套接字读取超时

我的理解:

    关闭连接:发生的原因可能是由于某种网络中断或数据库由于某种“不活动”而关闭了会话 java.sql.SQLException:Io 异常:套接字读取超时:这是一种连接成功但由于某种原因套接字/数据为空并最终超时的情况,因为没有数据可用。

是否可以在本地 Oracle DB 环境中复制上述错误?步骤是什么?

感谢您抽出宝贵时间回复。

谢谢。

【问题讨论】:

【参考方案1】:

您对封闭连接的理解是正确的。关闭连接的原因:防火墙、网络设备和远程数据库监听器等外部设备可以在一段时间不活动后强制关闭网络连接

ReadTimeOut 即使在活动连接上也会发生。如果查询或过程花费大量时间,您将收到读取超时异常。

关闭连接:在数据库运行时关闭数据库监听器 ReadTimedOut : 在程序中添加睡眠超过 10 分钟,然后从应用程序调用该程序

Oracle DB env 中 Socket 读取超时错误的复制:

    setNetworkTimeout for SQL connection // 例如,设置超时为 120 秒

    从 java 调用数据库过程并在该过程中休眠超过 setNetworkTimeout 的时间

    dbms_lock.sleep(125); -- sleeps for 125 seconds
    

由于程序在 120 秒内由于 125 秒睡眠而没有返回,java 将在上述情况下抛出套接字读取超时。

【讨论】:

【参考方案2】:

我刚刚开始使用 java.sql.* 包,但这是我所理解的。关闭的连接是发生错误并且数据库会话关闭,但没有进行错误处理,因此它结束了。使用 java.SQException 您可以管理此错误(使用 throws 子句)并将其打印出来或执行其他错误处理方法。

这是来自 Oracle 的关于异常以及如何处理它们的链接。

希望这会有所帮助。

Exceptions in Java.

【讨论】:

感谢您的意见。对于关闭的连接错误,我试图弄清楚数据库关闭连接和网络干扰之间是否存在差异,两者是否提供相同的错误或是否存在区别。另外,我相信两者都是例外,对java.sql.SQLRecoverableException: Closed Connection 另外,Socket 超时异常呢,具体原因是什么,例如“网络”中断。 @kart0624 我不确定。尝试记录错误代码以查看它们是否不同。显然,它们发生的原因不同,但它们可能使用也可能不使用相同的错误代码。如果您不熟悉,这里有一些关于登录 java 的信息。 link

以上是关于java.sql.SQLException:Io 异常:套接字读取超时与关闭连接的主要内容,如果未能解决你的问题,请参考以下文章

java.sql.SQLException:Io 异常:指定了未知主机

java.sql.SQLException: Io 异常: Socket closed

java.sql.SQLException: Io 异常: Broken pipe 如何在不重启的情况下恢复?

java.sql.SQLException: Io 异常: Socket read timed out

java.sql.SQLException:Io 异常:在与 oracle 的 JDBC 连接期间从读取调用中得到减一

java.sql.SQLException: Io 异常: Got minus one from a read call