linux服务器中的“java.sql.SQLException:I / O错误:连接重置”

我有一个连接到oracle数据库的java程序,有时它工作,有时会显示我的错误信息:

线程“main”中的exceptionjava.sql.SQLRecoverableException:IO错误:连接重置

at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:498) at oracle.jdbc.driver.PhysicalConnection.(PhysicalConnection.java:553) at oracle.jdbc.driver.T4CConnection.(T4CConnection.java:254) at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:32) at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:528) 

我怎么能解决这个问题? 谢谢。

答案来自oracle论坛, 在这里

java.security.SecureRandom是sun提供的标准API。 在这个类提供的各种方法中, void nextBytes(byte[])

该方法用于生成随机字节。 Oracle 11g JDBC驱动程序使用此API在登录期间生成随机数。 使用Linux的用户遇到了SQLException("Io exception: Connection reset")

问题有两个:

  1. 当调用SecureRandom.nextBytes(byte[])时,JVM会尝试列出/ tmp(或-Djava.io.tmpdir设置的备用tmp目录)中的所有文件。 如果文件数量很大,则该方法需要很长时间才能响应,从而导致服务器超时

  2. 方法void nextBytes(byte[])在Linux上使用/ dev / random,在缺少随机数生成硬件的某些机器上,操作速度降低到使整个登录过程停止的程度。 最终用户遇到SQLException(“Io exception:Connection reset”)

如果底层操作系统是在故障硬件上运行的Linux,则升级到11g的用户可能会遇到此问题。

其原因尚未确切确定。 它可能是硬件中的问题,也可能是由于某种原因软件无法从dev/random读取的事实

解决方案似乎将此设置添加到jvm

 -Djava.security.egd=file:/dev/./urandom 

当应用程序与数据库之间的连接断开连接(例如网络问题或所需的资源)时,通常会发生连接重置。

检查以下post,它应该让你知道要检查什么。 SQLRecoverableException:I / Oexception:连接重置