在
Linux x86
上使用Java 1.5以上版本时发生ODI接收信息超时错误。
适用于:
Oracle数据集成-版本:10.1.3.6.0往后版本【发行:发行:10gR3以及往后版本】
Linux x86
症状
在执行Linux x86 与 Java 1.5以上版本的Oracle数据集成器(ODI)方案时收到了超时。
com.sunopsis.sql.l: Oracle Data Integrator Timeout: connection with URL
Com.sunopsis.sql:Oracle数据集成器超时:链接URL
jdbc:oracle:thin:@XXXXXXXX:1521:DB1and user ODI.
at com.sunopsis.sql.SnpsConnection.a(SnpsConnection.java)
at com.sunopsis.sql.SnpsConnection.connect(SnpsConnection.java)
at com.sunopsis.dwg.cmd.e.j(e.java)
at com.sunopsis.dwg.cmd.e.i(e.java)
at com.sunopsis.dwg.cmd.e.A(e.java)
at com.sunopsis.dwg.DwgJv.treatCmd(DwgJv.java)
at com.sunopsis.dwg.DwgJv.main(DwgJv.java)
at oracle.odi.Agent.main(Agent.java)
DwgJv.main: Exit. Return code:-1
最终,用户会收到一个”java.sql.SQLRecoverableException: IO操作异常:请重新连接”的消息,例如
java.sql.SQLRecoverableException: IO Error: Connection reset
at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:421)
at oracle.jdbc.driver.PhysicalConnection.(PhysicalConnection.java:531)
at oracle.jdbc.driver.T4CConnection.(T4CConnection.java:221)
at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverE
原因
使用的Java运用程序和Oracle11g数据库,在Linux操作系统上的Oracle JDBC驱动程序,可能会遇到字节的I/O“重新连接”的消息,这是由于“void nextBytes(byte[])”方法在实现”java.security.SecureRandom”时,由Oracle提供的标准API用于生成随机字节。这是因为防止有故障的硬件软件读出”dev/dandom”。
这个问题有2种:
当SecureRandom.nextBytes(byte[])函数被调用时,JVM总是尝试将列出的所有文件在/tmp(或者备用的tmp目录设置-Djava.io.tmpdir)。
如果该文件很大时,这个方法就要执行很长时间才能做出响应,从而导致服务器弹出超时信息。
该方法void nextByTES(byte[])使用了Linux上的/dev/random,并在某些机器上缺乏随机数生成硬件的运作就会使整个登录过程停止速度的减慢。
最终,用户就会遇到 I/O“重新连接”异常。
解决方案
Oracle Sun 公司推荐如下2种解决方案:
编辑”jre/lib/security/java.security”这个文件或者
在调用Java程序时,设置系统属性”java.security.egd”覆盖”securerandom.source”的Java设置,使其指向”/dev/urandom”而不是默认的”/dev/random”。
Oracle 数据集成器(ODI),请运用的解决方案如下:
编程ODI ”bin”目录下的 ”odiparams.sh”这个配置文件。
找到 ODI_ADDITIONAL_JAVA_OPTIONS这个变量,并添加”Djava.security.egd=file:/dev/urandom”这个真正的值。
例如:
#
# Additional Java Options
#
ODI_ADDITIONAL_JAVA_OPTIONS="-Djava.security.egd=file:/dev/urandom"
Apply the changes, and restart the ODI Agents and/or Scenario executions.
运用这个修改,并重新启动ODI代理,执行这个方案。