��Java语言sql。SQLException:输入/输出错误:连接重置�� 在linux服务器中[英] "java.sql.SQLException: I/O Error: Connection reset" in linux server

问题描述

我有一个连接到 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论坛,这里:

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

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

问题有两个方面:

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

  2. 方法 void nextBytes(byte[]) 在 Linux 和一些缺少随机数的机器上使用/dev/random数字生成硬件操作减慢到使整个登录过程到的程度停下来.最终用户遇到 SQLException("Io 异常:连接重置")

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

目前尚未确切确定其原因.这可能是硬件问题,也可能是事实由于某种原因,该软件无法读取 dev/random

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

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

本文地址:https://www.itbaoku.cn/post/978421.html