The last packet successfully received from the server was 900,045 milliseconds ago.

旧城冷巷雨未停 提交于 2021-01-19 03:00:39
  • 异常信息
2018-12-12 21:57:07.034 8084 --- [SimpleAsyncTaskExecutor-3130] com.alibaba.druid.pool.DruidDataSource : discard connection
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

The last packet successfully received from the server was 900,045 milliseconds ago.  The last packet sent successfully to the server was 900,044 milliseconds ago.
        at sun.reflect.GeneratedConstructorAccessor111.newInstance(Unknown Source)
        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:411)
        at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1121)
        at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3670)
        at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3559)
        at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4110) 
  • 解决过程

      其实这个问题特别简单,就是超时了,根据打印的sql记录,还能显示出执行插入sql的时候超时了。问题一目了然,对于这个模块来说本质上是循环插入的,但是这样数据库的IO操作比较多,所以我就把这一部分整合到一起插入,结果数据量大,插入方法时间执行过长了。

      最简单的方式
将数据拆分每500条执行一次插入操作,缺点IO操作比较多,没有从本质解决问题。

  • 排查错误过程 

先说系统数据库连接这一部分配置 
1、数据库 
2、mycat 
3、druid 
4、p6sy 

    超时的问题就是上述某一部分或者某几部分连接超时造成,那就逐步排查吧。 
1、p6sy 
先排除p6sy,因为p6sy是将程序中执行的sql规范化,只是对执行sql加工处理,不涉及时间的问题。 
2、Druid数据源 
DruidDataSource配置属性列表 
https://github.com/alibaba/druid/wiki/DruidDataSource%E9%85%8D%E7%BD%AE%E5%B1%9E%E6%80%A7%E5%88%97%E8%A1%A8 
其中属性:timeBetweenEvictionRunsMillis,作用是: 
配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
Destroy线程会检测连接的间隔时间,如果连接空闲时间大于等于 minEvictableIdleTimeMillis 则关闭物理连接。系统配置的是28800秒,将其调大后,问题没有解决,说明不是druid的配置造成的。 
3、Mycat 
这一部分的检测是直接将mycat换成直连mysql,根据判断问题是否解决,以验证是否为mycat造成的。 
重试,问题依旧没有得到解决。 
4、MySQL 
经过上面的排查,可以得知MySQL的配置限制了程序的运行。查看MySQL的连接时间配置。

mysql> show global variables like '
%timeout%';
+----------------------------+-------+
| Variable_name              | Value |
+----------------------------+-------+
| connect_timeout            | 10    |
| delayed_insert_timeout     | 300   |
| innodb_lock_wait_timeout   | 50    |
| innodb_rollback_on_timeout | OFF   |
| interactive_timeout        | 28800 |
| net_read_timeout           | 30    |
| net_write_timeout          | 60    |
| slave_net_timeout          | 3600  |
| table_lock_wait_timeout    | 50    |
| wait_timeout               | 28800 |
+----------------------------+-------+
10 rows in set
mysql> 

简单介绍一下每个时间代表的意义 
connect_timeout 连接超时 mysql连接共有6次握手,3次TCP协议这个跟connect_timeout参数没有关系,另外3次跟connect_timeout参数有关系,该参数主要是为了防止网络不佳时应用重连导致连接数涨太快,一般默认即可。 
delayed_insert_timeout 这是为MyISAM INSERT DELAY设计的超时参数,在INSERT DELAY中止前等待INSERT语句的时间 
interactive_timeout 服务器关闭交互式连接前等待活动的秒数。交互式客户端定义为在mysql_real_connect()中使用CLIENT_INTERACTIVE选项的客户端。参数默认值:28800秒(8小时) 
lock_wait_timeout 锁等待超时时间 
net_read_timeout / net_write_timeout 这个参数只对TCP/IP链接有效,分别是数据库等待接收客户端发送网络包和发送网络包给客户端的超时时间,这是在Activity状态下的线程才有效的参数 
slave_net_timeout 解释:这是Slave判断主机是否挂掉的超时设置,在设定时间内依然没有获取到Master的回应就人为Master挂掉了 
wait_timeout 服务器关闭非交互连接之前等待活动的秒数 
分析上面超时时间代表的含义,再根据自己的情况,修改 
解决方案 
net_read_timeout/net_write_timeout的时间调大,重新测试完美解决!
--------------------- 
作者:Mandy-贾文静 
来源:CSDN 
原文:https://blog.csdn.net/jiadajing267/article/details/79516989 
版权声明:本文为博主原创文章,转载请附上博文链接!

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!