应用获取不到数据 - 解决报错:The driver has not received any packets from the server.

59,884 阅读3分钟

开发部署的应用程序,一直都在正常运行,但最近一次访问,突然获取不到数据。

报错主要信息:

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.

错误解析:

从错误信息中可以看出,应用与mysql服务器的通信链接失败了,接收不到mysql服务器返回的数据包。

解决方法总结:

方法一:

检查数据库连接地址是否正确。(配置文件中url)

方法二:

mysql5以前的版本在jdbc连接url上增加autoReconnect=true配置(表示自动连接)

方法三:

mysql5将其连接的等待时间wait_timeout缺省为8小时(28800秒),如果在wait_timeout期间内,数据库连接一直处于等待状态,mysql5将关闭连接,此时,应用的连接池仍然合法持有该数据库的连接引用,但当执行数据库操作时,就出现了上述报错。

mysql-wait_timeout.png

因此,解决方法就是:修改mysql全局变量wait_timeout的值。

怎么修改wait_timeout的值呢?

在文件my.ini的最后增加一行:wait_timeout=2073600 ,然后重启mysql(2073600秒 = 24天)

说明:

my.init文件,windows系统中在mysql的安装目录下,如:C:\ProgramData\MySQL\MySQL Server 8.0\my.ini

linux系统中位置为/etc/my.ini,或在/etc目录或其他目录下查找一下:find /etc/ -type f -name 'my.ini' -printf '%p \n'

扩展学习:

1. 与mysql服务器的连接方式

与mysql服务器的连接方式,分为两种:交互式连接,非交互式连接。

<1> 交互式连接

交互式连接:指的是客户端方式连接,连接到mysql服务器,一般都有重连机制(断开后操作sql会自动连接)

可分为:

  • 指令连接

    CMD终端命令执行连接指令,连接mysql服务器。 #mysql -hlocalhost -p3306 -u root -p

  • 工具连接

    如navicat数据库管理工具,连接mysql时,内部封装了客户端连接指令。

<2> 非交互式连接

非交互式连接:指的是非客户端方式连接,如应用程序连接池,JDBC等

2. 参数说明

<1> wait_timeout

wait_timeout:表示非交互式连接时,连接处于空闲状态多久,会被mysql切断掉。 默认是28800秒,即8小时。这个默认的时间比较短。(非交互式连接,wait_timeout才生效)

mysql-wait_timeout.png

<1> interactive_timeout

interactive_timeout:表示交互式连接,连接处于空闲状态多久,会被mysql切断掉。 默认是28800秒,即8小时。(交互式连接,interactive_timeout才生效)

mysql-interactive_timeout.png

3. 连接异常情况整理

情况1:The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.

情况2:ERROR 2013 (HY000): Lost connection to MySQL server during query

情况1和情况2为非交互式连接(如tomcat运行项目)请求访问数据库连接异常。

情况3:ERROR 2006 (HY000): MySQL server has gone away. No connection. Trying to reconnect...

情况3为交互式连接异常,如客户端连接到命令行mysql>...