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")
。
问题有两个:
-
当调用
SecureRandom.nextBytes(byte[])
时,JVM会尝试列出/ tmp(或-Djava.io.tmpdir设置的备用tmp目录)中的所有文件。 如果文件数量很大,则该方法需要很长时间才能响应,从而导致服务器超时 -
方法
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:连接重置