使用Druid出现Causedby:com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
)
一、Druid连接池配置问题
代码片
.
# 配置获取连接等待超时的时间
maxWait: 60000
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
timeBetweenEvictionRunsMillis: 60000
# 配置一个连接在池中最小生存的时间,单位是毫秒
minEvictableIdleTimeMillis: 300000
validationQuery: SELECT 1
testWhileIdle: true
二、DB的wait_timeout设置(主要原因)
wait_timeout巨坑,连接池在一开始获取连接的时候例如初始化连接是5个,在数据库原有的连接还有,连接池会记录这个个连接是可用的,但是你自己的数据库检测连接默认是60秒进行检测,等你在执行任务的时候,这个连接在你使用的上一毫秒失效了,mysql自动断开连接,你再使用这个连接运行SQL的时候就抛出了上面的异常,获取连接超时:
- MySQL连接超时相关的两个参数interactive_timeout和wait_timeout的区别和解释;
interactive_timeout针对交互式连接,wait_timeout针对非交互式连接。所谓的交互式连接,即在mysql_real_connect()函数中使用了CLIENT_INTERACTIVE选项。
说得直白一点,通过mysql客户端连接数据库是交互式连接,通过jdbc连接数据库是非交互式连接。
interactive_timeout:交互式连接超时时间(mysql工具、mysqldump等)
wait_timeout:非交互式连接超时时间,默认的连接mysql api程序,jdbc连接数据库等 - global级别的wait_timeout28800秒 ;
mysql> show global variables like ‘wait_timeout’;
±--------------±------+
| Variable_name | Value |
±--------------±------+
| wait_timeout | 28800 |
±--------------±------+
1 row in set (0.00 sec)
- session级别的wait_timeout 28800秒 ;
mysql> show session variables like ‘%wait%’;
±-------------------------±---------+
| Variable_name | Value |
±-------------------------±---------+
| innodb_lock_wait_timeout | 50 |
| innodb_spin_wait_delay | 6 |
| lock_wait_timeout | 31536000 |
| wait_timeout | 28800 |
±-------------------------±---------+
4 rows in set (0.00 sec)
总结
问题排查思路,从项目–>连接池版本–>java mysql驱动版本–>连接池配置–>服务器–>数据库wait_timeout的配置
问题没有确定的参数,需要结合自己的配置,以及项目需求进行调配