通信链路故障发送到服务器的最后一个数据包是4毫秒前

时间:2016-07-28 14:10:02

标签: java mysql sockets jdbc percona

首先,我知道这个问题被多次询问,但对我来说,我猜的再现情况差别不大(很可能)。

对于mysql运行状况检查,我们进行简单的选择查询(从双选择1)。 一旦mysql服务器闲置一段时间(大约1分钟)并且我们尝试健康检查,我们就会遇到这个问题..

  

通信链路故障\ n \ n发送到服务器的最后一个数据包是4毫秒前

     

“message”:“无法读取服务器的响应。预计读取4个字节,在连接意外丢失之前读取0个字节。”,                   “stack”:[“com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:2431)”,“com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2882)”,                             “com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2871)”,                             “com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3414)”,                             “com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1936)”,                             “com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2060)”,                             “com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2536)”,                             “com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2465)”,                             “com.mysql.jdbc.StatementImpl.execute(StatementImpl.java:734)”,                             “org.apache.commons.dbcp.DelegatingStatement.execute(DelegatingStatement.java:264)”,

如果我们再次尝试,我们立即获得成功连接,一切正常。所以它非常零星。

我看过这个stackoverflow帖子com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

所有这些可能性......我会回答其中的一些 -

  1. JDBC URL中的IP地址或主机名错误。 -NO(通信失败后第二次尝试)

  2. 本地DNS服务器无法识别JDBC URL中的主机名。 - (与步骤1相同的原因)

  3. JDBC URL中缺少或错误端口号。 - (与步骤1相同的原因)

  4. 数据库服务器已关闭。 -NO-(服务器已启动并正在运行)

  5. 数据库服务器不接受TCP / IP连接。 - (与步骤1相同的原因)

  6. 数据库服务器连接已用完。 - 没有(我的连接数增加到1000)

  7. Java和DB之间的某些东西阻止了连接,例如防火墙或代理。

  8. 是。代理配置如下:

    retries                 3
    timeout http-request    10s
    timeout queue           1m
    timeout connect         10s
    timeout client          1m
    timeout server          1m
    timeout http-keep-alive 10s
    timeout check           10s
    maxconn                 3000
    

    我的etc / my.conf细节很少如下 -

    connect_timeout  = 10
    wait_timeout     = 28800
    bind-address = 0.0.0.0
    max_connections = 1000
    

    为了创建连接,我使用的是公共dbcp datasource(org.apache.commons.dbcp.BasicDataSource)

    BasicDataSource dataSource = new BasicDataSource();
    dataSource.setDriverClassName("com.mysql.jdbc.Driver");
    dataSource.setUrl("url");
    dataSource.setUsername("username");
    dataSource.setPassword("pwd");
    dataSource.getConnection();
    

    请帮我找出可能出错的地方..它是导致问题的代理配置还是其他什么?非常感谢帮助。

1 个答案:

答案 0 :(得分:1)

  
      
  1. JDBC URL中的IP地址或主机名错误。 -NO(它在通信失败后第二次尝试工作)
  2.   

不,因为您已达到executeStatement(),这意味着您已经建立了连接并且PreparedStatement

  
      
  1. 本地DNS服务器无法识别JDBC URL中的主机名。 - (与步骤1相同的原因)
  2.   

正确。

  
      
  1. JDBC URL中缺少或错误端口号。 - (与步骤1相同的原因)
  2.   

正确。

  
      
  1. 数据库服务器已关闭。 -NO-(服务器已启动并正在运行)
  2.   

与(1),(2),(3)相同的原因。

  
      
  1. 数据库服务器不接受TCP / IP连接。 - (与步骤1相同的原因)
  2.   

正确。

  
      
  1. 数据库服务器连接已用完。 - 没有(我的连接数增加到1000)
  2.   

与(1),(2),(3),(4),(5)相同的原因。

  
      
  1. Java和DB之间的某些东西阻止了连接,例如防火墙或代理。
  2.   

不,原因与(1),(2),(3),(4),(5),(6)相同。

建立连接后,您的通信失败。这排除了你在这里提到的一切。剩下的是(a)服务器或网络中的瞬态条件,(b)客户端的连接池特性,(c)JDBC驱动程序提交的一些灾难性错误命令等。最有可能(a) )。