Talend 6.5连接Oracle执行大查询偶发Protocol violation协议违规错误
Talend 6.5连接Oracle大查询偶发Protocol violation错误修复方案
报错信息
job.job.my_job - tOracleInput_10 Protocol violation: [6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 1] java.sql.SQLException: Protocol violation: [6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 1] at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:527) at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:227) at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:531)
该报错属于Oracle JDBC驱动与数据库通信过程中的报文解析异常,偶发于大查询场景,可按以下步骤排查修复:
根因定位方向
- 驱动版本不兼容:Talend 6.5内置的Oracle JDBC驱动版本和连接的Oracle数据库版本不匹配,尤其是数据库版本为12c及以上时,使用旧版11g驱动跑大结果集查询,非常容易出现这类偶发协议解析错误
- 网络链路异常:大查询需要持续传输大量数据包,中间如果存在防火墙超时、TCP断包、会话空闲被回收的情况,会导致驱动接收到残缺报文抛出该错误
- JVM内存/GC异常:Talend作业运行时JVM堆内存不足,大查询拉取结果集过程中频繁GC导致JDBC线程接收报文超时,报文拼接出错
- 数据库端参数配置不合理:数据库的
OPEN_CURSORS、SESSION_MAX_OPEN_FILES等参数设置过小,大查询长时间占用会话资源被数据库强制中断,返回异常报文
排查修复步骤
- 替换匹配的JDBC驱动版本
找到Talend安装目录下的/lib/java路径,删除原有旧的ojdbc驱动包,上传和目标Oracle数据库大版本完全匹配的ojdbc驱动:比如Oracle 19c就用ojdbc8-19.x版本,Oracle 12c用ojdbc7-12.x版本,重启Talend Studio重新打包作业测试。 - 调整tOracleInput组件配置
- 开启组件属性中的使用游标获取数据选项,设置合理的
fetch size,建议取值范围为1000~5000,避免单次拉取过大结果集导致驱动内存溢出 - 配置数据库连接参数时追加
oracle.net.CONNECT_TIMEOUT=60000、oracle.jdbc.ReadTimeout=3600000,延长网络超时时间避免大查询过程中被主动断连
- 开启组件属性中的使用游标获取数据选项,设置合理的
- 调整作业JVM参数
在Talend作业的运行配置中,增加JVM启动参数:-Xms4G -Xmx8G -XX:+UseG1GC,可根据服务器内存情况进一步调大堆内存,避免大结果集处理时出现GC停顿 - 排查网络链路配置
联系运维确认Talend服务器到Oracle数据库之间的防火墙、负载均衡的会话超时时间,确保超时时间大于最长的单次查询运行时长,同时禁用会话空闲自动回收的规则 - 验证数据库端参数
联系DBA检查数据库的会话相关参数,确认OPEN_CURSORS设置不低于1000,PROCESSES、SESSIONS参数有足够余量支撑大查询运行
临时兜底方案
如果上述排查完成后还是偶发报错,可以在作业中给tOracleInput所在的子job增加重试机制,配置失败后自动重试2~3次,绝大多数偶发通信类报错都可以通过重试解决
内容的提问来源于stack exchange,提问作者Blag
相关产品推荐
相关产品推荐

