天天看点

记一次数据连接失败问题Caused by: java.io.EOFException: Can not read response from server. Expected to read 4 by

spark任务访问mysql,最近因为java异常导致任务失败。异常信息如下,

The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
        at com.mysql.jdbc.Util.handleNewInstance(Util.java:404)
        at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:981)
        at com.mysql.jdbc.MysqlIO.readPacket(MysqlIO.java:628)
        at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1014)
        at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2255)
        at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2286)
        at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2085)
        at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:795)
        at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:44)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
        at com.mysql.jdbc.Util.handleNewInstance(Util.java:404)
        at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:400)
        at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:327)
        at java.sql.DriverManager.getConnection(DriverManager.java:664)
        at java.sql.DriverManager.getConnection(DriverManager.java:247)

Caused by: java.io.EOFException: Can not read response from server. Expected to read 4 bytes, read 0 bytes before connection was unexpectedly lost.
        at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:2957)
        at com.mysql.jdbc.MysqlIO.readPacket(MysqlIO.java:560)
        ... 30 more
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
           

这个问题是没隔几天必定会出现,但是不是每天都出现。任务代码是每天执行一次,也就是没执行几次就一定会出现连接失败的问题,异常信息如上。建立连接是在spark任务的java代码中,且是在主节点上提交的。开始时猜测是数据库连接建立太多了。所以我在主节点提交了一个任务,任务就是执行建立数据库连接代码,循环执行1000次。1000次跑完了任然没有发现异常信息。然后怀疑不是因为数据库连接过多的问题。因为我们任务每天也就50条以内的连接,1天也不过500,况且用完了还会释放。所以应该不是连接过多的缘故。

然后猜测是网络带宽的问题,带宽被用完了。然后模拟场景,本机开启多线程任务不断去连接主节点的数据库(连接之后不会close),然后发现本机会出现上述异常,且异常大都是在带宽飙到20M/s左右发生。当本机有异常的时候,主节点跑的连接数据库任务(连接之后不会close)也会打印出异常信息。至此问题复现

我再此得出的结论是数据库连接也要保证网络畅通的情况,带宽不足怎么样都会出现连接不上的情况的

继续阅读