Java SQLRecoverableException:I/O异常:连接重置

Java SQLRecoverableException:I/O异常:连接重置,java,oracle,ioexception,connection-reset,Java,Oracle,Ioexception,Connection Reset,昨天晚上,我带着自己编写的Java程序离开了办公室。它应该使用JDBC连接将大量记录插入我们的公司数据库(Oracle)。今天早上,当我回来工作时,我看到了这个错误(被一个try-catch捕获): 这个程序在遇到这个问题之前写了几乎所有的记录,但是如果它发生得很早(就在我晚上离开办公室几分钟后),该怎么办?我无法理解发生了什么,我联系了我的数据库管理员,他说数据库没有特别的问题 你知道发生了什么事吗?我能做些什么来避免它?你的异常说明一切都是“连接重置”。 java进程和db服务器之间的连接丢

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

这个程序在遇到这个问题之前写了几乎所有的记录,但是如果它发生得很早(就在我晚上离开办公室几分钟后),该怎么办?我无法理解发生了什么,我联系了我的数据库管理员,他说数据库没有特别的问题


你知道发生了什么事吗?我能做些什么来避免它?

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

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


这可能无法回答您的问题,但您将了解它发生的原因。您可以与您的DBA进一步讨论,看看您的案例中是否存在特定的问题。

在从11g升级到12c之后,我们间歇性地遇到了这些错误,我们的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 
几天后,仍然是间歇性连接重置

我们最终删除了上面所有的Java7。Java6很好。通过将其添加到我们的用户bash_配置文件中,问题得到了解决

遇到错误的groovy脚本在批处理VM服务器上使用了/dev/random。下面强制java和groovy使用/dev/uradom


export JAVA_OPTS=“$JAVA_OPTS-Djava.security.egd=file:///dev/urandom “

解决方案
更改应用程序的设置,以便在java命令旁边输入以下参数[-Djava.security.egd=file:/dev/./dev/uradom]:

java-Djava.security.egd=file:/dev/./dev/uradom[您的命令]


Ref:-

某些RedHat发行版出现错误。您只需要使用参数java.security.egd运行应用程序=file:///dev/urandom

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

我想给出一个关于的解决方案的补充答案

我最近试图解决一个问题,一个Java编写的应用程序(实际上是Talend ELT作业)想要连接到Oracle数据库(11g及以上),然后随机失败。操作系统是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 ...
注意:这个“/。/”很重要,不要丢掉它

因此,启动命令行可以是:

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

更改对于新运行的应用程序立即生效

至于解决方案#1,此解决方案的一个缺点是,由于随机性受到影响,生成的数字的安全性稍差。这一次,它对全球JVM产生了影响。至于解决方案#1,如果你不在军事或秘密相关行业工作,那么这个解决方案可以是你的

理想情况下,我们应该在Java5之后使用“file:/dev//uradom”,因为前面的路径将再次指向/dev/random

报告的错误:

解决方案3-硬件解决方案 Disclamer:我与任何硬件供应商或产品都没有关联

如果您需要达到高质量的随机性级别,您可以用一块硬件替换Linux随机数生成器软件

有些信息是可用的

问候


托马斯

我在一份星火般的工作中阅读甲骨文时也遇到过类似的情况。此连接重置错误是由Oracle服务器和所用JDBC驱动程序之间的不兼容引起的。值得检查。

在run命令中添加java安全性


java-jar-Djava.security.egd=”file:///dev/urandom“yourjarfilename.jar

我还建议您对数据库虚拟机进行磁盘空间检查,以便为DBA提供继续操作的可能原因。df-hBeen绞尽脑汁想了3天,终于解决了这个问题。多么离谱的问题!!此外,要获得更深入的答案,请查看3天?这已经是两个月的头痛了,非常感谢!(我猜OpenStack熵吞吐量比VMware低很多)我们把这个配置java-Djava.security.egd=文件放在哪里?你不需要把它放在任何配置文件上。你只需要用建议的行运行你的应用程序。我只是考虑一下,解决方案4可能是在数据库服务器配置上直接延长超时期限以超过60秒限制。
在SqLNET.ORA和TnNAMAMORORACLE的监听器配置文件中,您可以考虑<代码> TCP。CONTROGTIMEOUT 和<代码> SqLNET。解决方案1中的“/。/”很重要吗?
-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>
securerandom.source=file:/dev/random
securerandom.source=file:/dev/urandom