oracle SQLRecoverableException:I/O Exception:连接重置

inb24sb2  于 2023-11-17  发布在  Oracle
关注(0)|答案(8)|浏览(204)

昨天晚上我离开办公室时,我写了一个运行中的Java程序。它应该使用JDBC连接将大量记录插入到我们公司的数据库(Oracle)中。今天早上当我回来工作时,我看到这个错误(由try-catch捕获):

java.sql.SQLRecoverableException: I/O Exception: Connection reset

字符串
程序在出现这个问题之前几乎写了所有的记录,但是如果它发生在早期(晚上离开办公室后几分钟)呢?我不明白发生了什么,我联系了我的数据库管理员,他说数据库上没有特别的问题。
你知道发生了什么吗?我能做些什么来避免它?

vktxenjb

vktxenjb1#

该错误发生在某些RedHat发行版上。您需要做的唯一事情是使用参数java.security.egd=file:/dev/urandom运行应用程序:

java -Djava.security.egd=file:///dev/urandom [your command]

字符串

4si2a6ki

4si2a6ki2#

我想对nacho-soriano的解决方案给出一个补充的答案。。
我最近在寻找解决一个问题,其中Java编写的应用程序(实际上是Talend© ELT作业)想要连接到Oracle数据库(11 g及以上),然后随机失败。操作系统是RedHat Enterprise和CentOS。作业运行时间非常快(不超过半分钟),并且经常发生(大约每5分钟运行一次)。
有时候,在夜间工作时间,在数据库密集型工作使用作为懒惰的工作使用,在一个词随机,连接失败与此消息:

Exception in component tOracleConnection_1
java.sql.SQLRecoverableException: Io exception: Connection reset
        at oracle.jdbc.driver.SQLStateMapping.newSQLException(SQLStateMapping.java:101)
        at oracle.jdbc.driver.DatabaseError.newSQLException(DatabaseError.java:112)
        at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:173)
        at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:229)
        at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:458)
        at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:411)
        at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:490)
        at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:202)
        at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:33)
        at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:465)
        at java.sql.DriverManager.getConnection(DriverManager.java:664)
        at java.sql.DriverManager.getConnection(DriverManager.java:208)
    and StackTrace follow ...

字符串

问题说明:##

详细信息here
Oracle连接需要一些随机数来承担一个良好的安全级别。Linux随机数生成器根据键盘和鼠标活动(以及其他活动)生成一些数字,并将它们放置在堆栈中。你会同意我,在服务器上,没有大量的此类活动。因此,软件使用的随机数可能比生成器产生的随机数多。
当池为空时,从/dev/random的读取将被阻止,直到收集到额外的环境噪音。Oracle连接超时(默认为60秒)。

解决方案1 -针对一个应用的解决方案##

解决方案是给予添加两个参数,在启动时给JVM:

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

注意:'/./'很重要,不要丢弃它!

所以启动命令行可以是:

java -Djava.security.egd=file:/dev/./urandom -Dsecurerandom.source=file:/dev/./urandom -cp <classpath directives> appMainClass <app options and parameters>


这种解决方案的一个缺点是,生成的数字 * 有点不安全 *,因为随机性受到影响。如果你不在军事或秘密相关行业工作,这个解决方案可以是你的。

解决方案2 -Java JVM通用解决方案##

here所示
解决方案1中给出的两个指令都可以放在Java安全设置文件中。
查看$JAVA_HOME/jre/lib/security/java.security
更改线

securerandom.source=file:/dev/random


securerandom.source=file:/dev/urandom


更改对新运行的应用程序立即生效。
至于解决方案#1,这个解决方案的一个缺点是,由于随机性受到影响,生成的数字 * 有点不安全 *。这一次,它是一个全局JVM的影响。至于解决方案#1,如果你不在军事或秘密相关行业工作,这个解决方案可以是你的。
我们应该在Java 5之后使用“file:/dev/./urandom”,因为前面的路径将再次指向/dev/random。
报告的Bug:https://bugs.openjdk.java.net/browse/JDK-6202721

方案三-硬件方案##

**Disclamer:**我没有链接到任何硬件供应商或产品.

如果您需要达到一个高质量的随机性水平,您可以用一个硬件来代替Linux随机数生成器软件。
一些信息是可用的here
问候
托马斯

piv4azn7

piv4azn73#

这仅仅意味着后端(DBMS)中的某些东西由于资源不可用等原因决定停止工作。这与您的代码或插入的数量无关。您可以在这里阅读更多关于类似问题的信息:

这可能无法回答您的问题,但您将了解为什么会发生这种情况。您可以与DBA进一步讨论,看看您的案例中是否有特定的内容。

lnvxswe2

lnvxswe24#

解决方案

更改应用程序的设置,因此您可以在java命令旁边设置[-Djava.security.egd=file:/dev/../dev/urandom]参数:
java**-Djava.security.egd=file:/dev/../dev/urandom**[您的命令]
Ref:- https://community.oracle.com/thread/943911

6mw9ycah

6mw9ycah5#

在从11 g升级到12 c之后,我们间歇性地遇到了这些错误,我们的java是1.6。
对我们来说,解决办法是将Java和JDBC从6升级到7

export JAVA_HOME='/usr/java1.7'

export CLASSPATH=/u01/app/oracle/product/12.1.0/dbhome_1/jdbc/libojdbc7.jar:$CLASSPATH

字符串
几天后,仍然断断续续的连接重置。
我们最终删除了上面所有的Java 7。Java 6很好。通过将此添加到我们的用户bash_profile中,问题得到了解决。
我们的groovy脚本在批处理VM服务器上使用/dev/random时遇到了这个错误。下面强制java和groovy使用/dev/urandom。
导出JAVA_OPTS=”$JAVA_OPTS -Djava.security.egd=file:/dev/urandom“

vvppvyoh

vvppvyoh6#

你的异常说明了一切“Connection reset”。你的java进程和db服务器之间的连接丢失了,这可能是由于几乎任何原因(比如网络问题)发生的。SQLRecoverableException只是意味着它是可恢复的,但根本原因是连接重置。

jvidinwx

jvidinwx7#

我在Spark作业中从Oracle阅读时也遇到过类似的情况。这个连接重置错误是由Oracle服务器和使用的JDBC驱动程序之间的不兼容引起的。值得检查一下。

nsc4cvqm

nsc4cvqm8#

在run命令中添加java安全性
第一个月

相关问题