项目背景是数据库和项目不在同一台服务器下,在启动时,突然遇到以下错误:
Exception in thread "main" 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.
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
在运行项目出现以上错误后,我多次尝试后依旧报错,但是我发现,使用客户端Navicat连接数据库,却可以正常连接…
通过搜寻探索,总结如下:
一、学习到 交互式连接以及非交互式链接的区别
1.交互式连接
指的是客户端连接,连接到MySQL服务器,且客户端连接都带有重连机制(断开后操作SQL会自动连接)
(1)指令连接
终端命令行执行连接指令,即可连接到mysql服务器。
$ mysql -hlocalhost -p3306 -uroot -p
或
$ mysql -uroot -p
Enter password:
(2)工具连接
例如navicat,虽然一个数据库管理工具,但连接MySQL时,其内部也是封装了客户端连接的指令。
mysql -h$ip -P$port -u$user -p
2.非交互式连接
指的是非客户端连接,例如应用程序创建连接池、JDBC连接~
本文开头提到我的应用访问MySQL引起的报错,指的就是非交互式连接断开了。
二、MySQL连接参数
autoReconnect
数据库连接异常,是否自动连接,autoReconnect=true表示自动连接
failOverReadOnly
数据库连接,是否设置为只读模式,failOverReadOnly=false表示只读模式
wait_timeout
wait_timeout 连接超时时间,表示非交互式连接(非交互式连接,wait_timeout才生效),连接处于空闲状态多久,MySQL会被切断掉。默认28800(单位秒,即8小时),这个时间显然是比较短的。所以经常出现有小伙伴反馈说第二天来,再跑项目请求访问数据库时,就抛数据库连接异常的信息了
interactive_timeout
interactive_timeout表示交互式连接后(非交互式连接,interactive_timeout才生效),连接处于空闲状态多久,会被MySQL切断掉。默认28800(单位秒,即8小时)。
由于问题原因的不同,这里提供大家几种方式,仅供尝试解决。
1.一种是将SSL=true选项删除掉,但是会报
Establishing SSL connection without server’s identity verification is
not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+
requirements SSL 。。。。等等警告
那么就将useSSL赋值为false,这样就不会警告了。
2.另一种,也就是我所解决的方法
由于wait_timeout默认是8小时,一个空闲的连接超过8小时,MySQL将自动断开连接,连接池却觉得这个连接可用,然后就相当于用失效连接了,然后就出错…
配置操作
2.1配置生效范围
2.1.1指令配置(会话立即生效)
MySQL> set wait_timeout 604800;
MySQL> set interactive_timeout 604800;
这种方式只是针对当前会话连接生效,连接断开后重新连接,set配置的wait_timeout会失效,被替换成全局global的interactive_timeout参数值。
2.1.2指令配置(全局立即生效)
MySQL> set global 604800;
MySQL> set global interactive_timeout 604800;
配置后立即生效,针对全局的所有连接,即便连接断开重连,set配置的wait_timeout还是生效。
2.1.3文件配置(全局重启mysql后生效)
vi /etc/my.cnf
修改MySQL的配置文件,这种方式针对所有连接,优先级最高,修改参数值后,重启MySQL服务生效,会覆盖所有set命令方式配置的wait_timeout、interactive_timeout参数值。
2.2参数配置(问题解决方案)
2.2.1 配置连接参数
通过修改应用的配置文件jdbc.properties的数据库连接参数,追加追加红色部分内容:
jdbc.url=jdbc:mysql://192.168.0.109:3306/test?useUnicode=true&characterEncoding=utf8&useSSL=false&autoReconnect=true&failOverReadOnly=false
表示采用自动重连机制,这种方式可能会不生效,往下继续配置连接超时时间~
2.2.2 配置连接超时时间
指令配置(方式一)
该方式更适用于不需要重启MySQL服务,修改全局wait_timeout超时时间后立刻生效的场景~
第一步:连接mysql
$ mysql -uroot -p
第二步:查看wait_timeout
mysql> show global variables like '%timeout%';
第三步:修改时间
mysql> set global wait_timeout=604800;
mysql> set global interactive_timeout=31536000;
参数值说明:604800=7天,31536000=365天
再次查看wait_timeout
mysql> show global variables like '%timeout%';
文件配置(方式二)
通过修改MySQL配置文件,重启MySQL服务生效,需谨慎,不能重启MySQL服务器的小伙伴可以通过方式一来实现~
第一步:修改配置文件
vi /etc/my.cnf
Linux操作系统MySQL的配置文件my.cnf 一般存在于/etc/my.cnf,具体按实际安装存放为准~
在[mysqld]后面添加以下内容(604800秒=7天,31536000=365天)
wait_timeout=604800
interactive_timeout=31536000
第二步:重启MySQL
修改my.cnf配置文件后,重启mysql才生效!!!!
$ service mysql restart
重启需谨慎,须按实际情况进行考虑!!!
最后,重新发送请求访问应用,看下是否还报连接数据库的报错!