在使用 DataX 抽取 Oracle 中的数据时,遇到了如下报错:
2021-04-19 14:04:47.207 [0-0-0-reader] ERROR ReaderRunner - Reader runner Received Exceptions:
com.alibaba.datax.common.exception.DataXException: Code:[DBUtilErrorCode-07], Description:[读取数据库数据失败. 请检查您的配置的 column/table/where/querySql或者向 DBA 寻求帮助.]. - 执行的SQL为: ****** 具体错误信息为:java.sql.SQLRecoverableException: IO 错误: Connection reset
at com.alibaba.datax.common.exception.DataXException.asDataXException(DataXException.java:26) ~[datax-common-0.0.1-SNAPSHOT.jar:na]
at com.alibaba.datax.plugin.rdbms.util.RdbmsException.asQueryException(RdbmsException.java:93) ~[plugin-rdbms-util-0.0.1-SNAPSHOT.jar:na]
at com.alibaba.datax.plugin.rdbms.reader.CommonRdbmsReader$Task.startRead(CommonRdbmsReader.java:220) ~[plugin-rdbms-util-0.0.1-SNAPSHOT.jar:na]
at com.alibaba.datax.plugin.reader.oraclereader.OracleReader$Task.startRead(OracleReader.java:110) ~[oraclereader-0.0.1-SNAPSHOT.jar:na]
at com.alibaba.datax.core.taskgroup.runner.ReaderRunner.run(ReaderRunner.java:57) ~[datax-core-0.0.1-SNAPSHOT.jar:na]
at java.lang.Thread.run(Thread.java:748) [na:1.8.0_191]
java.sql.SQLException: Io 异常: Connection reset 大意看起来应该是连接问题,网上查了一下,说是当数据库连接池中的连接被创建而长时间不使用的情况下,该连接会自动回收并失效,但客户端并不知道,在进行数据库操作时仍然使用的是无效的数据库连接,这样,就导致客户端程序报“java.sql.SQLException: Io 异常: Connection reset” 或 “java.sql.SQLException 关闭的连接” 异常。
网上跟这个问题相关的解决思路是 Connection Reset 的原因有可能有以下几种原因:
配置的数据连接池的连接数不够用;
数据库的连接池中的连接,长时间不用,数据库主动断开连接,而客户端不知道,在用的时候仍然拿到的是无效的连接;
分别对应以上的两种猜想的原因,进行处理:
配置连接池的最大、最小、空闲连接数等;
配置对连接池里的连接进行有效性检查,如,配置有效性连接检查 sql 语句,配置是否进行有效性检查等;
但是这两种方法都不太适用我目前的情况,因为我无法修改 DataX 底层的源代码,所以无法验证上边两种方法,但是我找到了另一种解决方法。
首先解释下另一种出现这个问题的原因:
连接 ORACLE 服务器,客户端要生成随机密钥用于客户端认证,linux 下 JDK 默认使用 /dev/random,random 采用阻塞方式生成随机数,生成的速度很慢,ORACLE 服务器会主动 reset,并在 alert.log 中报错:
TNS-12535: TNS:operation timed out
ns secondary err code: 12606
nt main err code: 0
nt secondary err code: 0
nt OS err code: 0
Client address: (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.6.21)(PORT=33460))
WARNING: inbound connection timed out (ORA-3136)
解决方案:
1、找到配置的 $JAVA_HOME
,如果自己知道的就不需要这一步。
cat /etc/profile
在文件中找到 export JAVA_HOME=
这一行,后边的路径记下来。
2、编辑 $JAVA_HOME/jre/lib/security/java.security
,$JAVA_HOME 替换为上一步查出的路径
vi /usr/local/jdk1.8.0_191/jre/lib/security/java.security
将文件中 securerandom.source=file:/dev/random
改为 file:/dev/urandom
(urandom采用非阴塞式生成随机数,性能很好,不会产生超时)
3、解决。
via: ojdbc在linux环境下 java.sql.SQLRecoverableException: IO Error: Connection reset 的问题 - leon.sang - 博客园 https://www.cnblogs.com/bmwsl/p/11412362.html