我有一个连接到 oracle 数据库的 java 程序,有时它可以工作,有时会向我显示此错误消息:
线程“main”中的异常 java.sql.SQLRecoverableException:IO 错误:连接重置
at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:498)
at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:553)
at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:254)
at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:32)
at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:528)
我该如何解决这个问题?
答案取自 oracle 论坛,here :
java.security.SecureRandom
是sun提供的标准API。在此类提供的各种方法中 void nextBytes(byte[])
。
此方法用于生成随机字节。 Oracle 11g JDBC 驱动程序使用此 API 生成随机数
登录。使用 Linux 的用户一直遇到 SQLException("Io exception: Connection reset")
。
问题有两个:
当
SecureRandom.nextBytes(byte[])
被调用。如果文件数量很大
方法需要很长时间
响应并因此导致服务器超时
方法 void nextBytes(byte[])
在 Linux 和一些缺少随机数的机器上使用/dev/random
数字生成硬件操作减慢到使整个登录过程无法进行的程度
停下来。最终用户遇到了 SQLException("Io exception:
连接重置")
如果底层操作系统是在故障硬件上运行的 Linux,升级到 11g 的用户可能会遇到此问题。
具体原因尚未确定。这可能是硬件问题或事实
由于某种原因,软件无法从 dev/random
中读取
解决方案似乎将此设置添加到 jvm
-Djava.security.egd=file:/dev/./urandom