“Communications link failure”的分析

连接数据库的一个报错,梳理一下用到的知识点

交互式连接以及非交互式链接

1.交互式连接

指的是客户端连接,连接到MySQL服务器,且客户端连接都带有重连机制(断开后操作SQL会自动连接)

(1)指令连接

终端命令行执行连接指令的方式,连接到mysql服务器。
mysql -h 主机名 -P 端口号 -u 用户名 -p密码(-p与密码之间不能有空格,其他参数名与参数值之间可以有空格也可以没有空格,密码建议在下一行输入)
mysql -h 127.0.0.1 -P 3306 -u root -proot

(2)工具连接

例如Navicate、DBeaver,虽然它们是数据库管理工具,但连接MySQL时,其内部也是封装了客户端连接的指令。
mysql -h 主机名 -P 端口号 -u 用户名 -p

2.非交互式连接

指的是非客户端连接,例如应用程序创建连接池连接(C3P0连接池、DBCP连接池、HikariCP连接池、Druid连接池)、jdbc连接。

wait_timeout:连接超时时间,表示【非交互式连接】后(非交互式连接,wait_timeout才生效),连接处于空闲状态多久,MySQL会被切断掉。默认28800(单位秒,即8小时)。一个空闲的连接超过8小时,MySQL将自动断开连接,连接池却觉得这个连接可用,然后就相当于使用失效连接了,就会出错

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

参数 wait_timeout 和 interactive_timeout 应尽量设置成相同

1、交互式连接的会话变量 wait_timeout 和 interactive_timeout 都继承自全局变量 interactive_timeout 的值。
2、非交互式连接的会话变量 wait_timeout 和 interactive_timeout 分别继承自全局变量 wait_timeout 和 interactive_timeout。
3、无论是交互式连接还是非交互式连接,连接闲置阈值都由会话变量 wait_timeout 控制,与会话变量 interactive_timeout 无关。

可能的解决方案

指令配置(全局立即生效)
查看wait_timeout
mysql> show global variables like ‘%timeout%’;

mysql> set global wait_timeout=604800;
mysql> set global interactive_timeout=31536000;
参数值说明:604800=7天,31536000=365天

配置后立即生效,针对全局的所有连接,即便连接断开重连,set配置的wait_timeout还是生效。再次查看wait_timeout
mysql> show global variables like ‘%timeout%’;

文件配置(重启MySQL服务生效)
MySQL配置文件在Windows下叫my.ini,在MySQL的安装根目录下;在Linux下叫my.cnf,文件通常位于/etc/my.cnf(可以用命令查找:find / -name my.cnf)。

在[mysqld]后面添加以下内容
wait_timeout=604800
interactive_timeout=31536000

修改my.cnf配置文件后,重启mysql才生效!!!!

参考 http://t.csdnimg.cn/W7zZp 和 http://t.csdnimg.cn/xLBtU 和 http://www.kailing.pub/article/index/arcid/160.html

另外的原因

连接是有效的,但是超过了设置的socketTimeout也会报这个错误。如果查询数据要花费5秒,而设置的socketTimeout=1000(单位是毫秒,这里是1秒)时,也会出现”Communications link failure“

补充知识

Druid连接池配置参数表的部分参数说明
initialSize:连接池初始化时创建的连接数,连接池创建连接时,会创建initialSize个连接,以确保应用程序在启动时可以立即获取到数据库连接。
maxActive:连接池中最大连接数,如果连接池中连接数达到maxActive,则应用程序获取连接的请求将被阻塞,直到有连接被释放。
minIdle:连接池中最小空闲连接数,如果连接池中空闲连接数少于minIdle,连接池会创建新的连接以达到minIdle。
maxIdle:连接池中最大空闲连接数。(已经不再使用,配置了也没效果)如果连接池中空闲连接数超过maxIdle,连接池会关闭多余的连接以避免占用过多的资源。
maxWait:获取连接时的最大等待时间,如果连接池中没有可用连接且已经达到最大连接数,则应用程序获取连接的请求将被阻塞,最多等待maxWait毫秒。配置了 maxWait 之后,缺省启用公平锁,并发效率会有所下降,如果需要可以通过配置useUnfairLock 属性为 true 使用非公平锁。
timeBetweenEvictionRunsMillis:间隔多久检测一次空闲连接(毫秒),连接池会定期检查空闲连接的状态,如果空闲时间超过minEvictableIdleTimeMillis,则将连接关闭。
minEvictableIdleTimeMillis:连接池中连接最小空闲时间(毫秒),连接保持空闲而不被驱逐的最小时间。
validationQuery:用于检测连接是否有效的SQL语句。如果 validationQuery 为 null,testWhileIdle、testOnBorrow、testOnReturn都不会起作用。
testWhileIdle:是否开启空闲连接的检测。如果开启,连接池会定期检查空闲连接的状态。建议配置为 true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于 timeBetweenEvictionRunsMillis,执行validationQuery 检测连接是否有效。
testOnBorrow:是否开启连接的检测功能,在获取连接时检测连接是否有效。如果开启,连接池在获取连接时会检查连接是否有效,做了这个配置会降低性能。。
testOnReturn:是否开启连接的检测功能,在归还连接时检测连接是否有效。如果开启,连接池在归还连接时会检查连接是否有效,做了这个配置会降低性能。

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值