DataX报错问题汇总

目录

一、错误一

二、错误二

三、错误三


一、错误一

报错信息:

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure The last packet successfully received from the server was 60,045 milliseconds ago. The last packet sent successfully to the server was 60,043 milliseconds ago.

尝试解决:

1.在jdbcURL上加上了 ?autoReconnect=true&failOverReadOnly=false
使用了之后呢,然后过了一段时间,还是报那个Communications link failure 错误,
然后继续探索,有帖子说了,autoReconnect=true 适用的是mysql 4.x版本可以用,
如果是5以上就不行,然后就马上看了一下自己的mysql版本,通过select version();看到自己mysql的是5.5的
2.于是就采用第二种方法:在mysql的my.ini里面加上这两个参数:wait_timeout=2147483 
,interactive_timeout=2147483 ,
帖子里说是在默认配置不改变的情况下,如果连续8小时内都没有访问数据库的操作,再次访问mysql数据库的时候,mysql数据库会拒绝访问,于是那就加上吧
3.把jdbcURl的ip地址链接,改成localhost,
(果然大神们的帖子都是干练到极致,小弟佩服)于是我就将自己的云服务器上的jdbc连接手动改成了localhost连接(开发工具上还是用ip连接,这里说的是将自己云服务器上的项目用localhost连接,所以是可以连接到数据库的),然后过了一段时间,发现是可以用的,再也没有Communications link failure 错误了,当然此时的我还是怀疑的,准备长时间不连接,等第二天早上再次链接,发现再也不会报这个错误了,至此这个坑终于填好了
4.durid保活机制参数设置

最终解决:

socketTimeout在jdbcurl配置那里写死了,写的60000,建议设置1800000(30min)

二、错误二

报错信息:

java.sql.SQLException: connection holder is null at com.alibaba.druid.pool.DruidPooledConnection.checkStateInternal(DruidPooledConnection.java:1157) 
at com.alibaba.druid.pool.DruidPooledConnection.checkState(DruidPooledConnection.java:1143) 
at com.alibaba.druid.pool.DruidPooledConnection.setAutoCommit(DruidPooledConnection.java:701) 
at com.alibaba.datax.plugin.rdbms.writer.CommonRdbmsWriter$Task.doOneInsert(CommonRdbmsWriter.java:374) 
at com.alibaba.datax.plugin.rdbms.writer.CommonRdbmsWriter$Task.doBatchInsert(CommonRdbmsWriter.java:362) 
at com.alibaba.datax.plugin.rdbms.writer.CommonRdbmsWriter$Task.startWriteWithConnection(CommonRdbmsWriter.java:291) 
at com.alibaba.datax.plugin.rdbms.writer.CommonRdbmsWriter$Task.startWrite(CommonRdbmsWriter.java:319) 
at com.alibaba.datax.plugin.writer.mysqlwriter.MysqlWriter$Task.startWrite(MysqlWriter.java:78) 
at com.alibaba.datax.core.taskgroup.runner.WriterRunner.run(WriterRunner.java:56) at java.lang.Thread.run(Thread.java:748)

报错信息:connection holder is null,所以在druid的源码中找有关连接的holder,在com.alibaba.druid.pool包下有一个DruidConnectionHolder,通过源码可以判定DruidConnectionHolder是连接和事务的关联,holder中持有一个连接。数据库事务commit之前的所有操作都要基于同一个Connection,所以可以推断出holder is null 就是连接被释放了,根据详细的异常堆信息at com.alibaba.druid.pool.DruidDataSource.getConnectionDirect(DruidDataSource.java:942)查看源码
getConnectionDirect方法中有一段代码会回收Connection,决定是否回收Connection的条件是removeAbandoned, 然后把连接放到activeConnections中,然后在DruidConnectionHolder的init()方法中发现连接销毁线程,销毁连接的方法判断执行时间是否大于removeAbandonedTimeoutMillis,如果大于则销毁,然后发现项目中连接池参数设置配置了如下
<property name="removeAbandoned" value="true"/>
<property name="removeAbandonedTimeout" value="60"/>
开启了removeAbandoned且设置了1分钟,由于项目中执行了一个盘点的worker,时长较长执行逻辑超过设置的阀值,连接被释放,触发上面的异常。

druidDataSource.setRemoveAbandonedTimeout(600); 由600s(10min)改为7200s(2h)

三、错误三

报错信息:

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: 
Application was streaming results when the connection failed. Consider raising value of 'net_write_timeout' on the server.

问题解决:

等待将一个block发送给客户端的超时时间过小导致
解决方案:
在数据源URL的连接上增加该参数,net_write_timeout/net_read_timeout设置稍微大一些,或者在RDS控制台调整该参数。
默认60s
例如:jdbc:mysql://192.168.1.1:3306/lizi?useUnicode=true&characterEncoding=UTF8&net_write_timeout=72000

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值