开发部署的应用程序,一直都在正常运行,但最近一次访问,突然获取不到数据。
报错主要信息:
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的值。
怎么修改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才生效)
<1> interactive_timeout
interactive_timeout:表示交互式连接,连接处于空闲状态多久,会被mysql切断掉。
默认是28800秒,即8小时。(交互式连接,interactive_timeout才生效)
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>...
网友评论