我想为nacho-soriano的解决方案提供一个补充答案......
我最近搜索解决一个问题,即 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 ...
问题解释:
如此处详述
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 解决方案
正如这里所解释的
解决方案 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。
报告的错误:https ://bugs.openjdk.java.net/browse/JDK-6202721
解决方案 3 - 硬件解决方案
免责声明:我与任何硬件供应商或产品都没有联系...
如果您需要达到高质量的随机性水平,您可以用一块硬件替换您的 Linux 随机数生成器软件。
一些信息可在此处获得。
问候
托马斯