Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up.
现象:同一服务器上同时启动多个相同项目做分服测试,结果是有的服务器成功启动,有的服务器启动失败,原因均为:mysql连接超时;
服务器情况:单服 centos7(32c64g) 上同时部署了 26个相同的多服拓展测试项目 + mysql5.7.18
问题解析:同服同项目情况下,多数(21个)项目成功启动,后续(5个)启动失败,而且均报mysql连接超时。那么可证明不是测试项目问题,而是mysql存在问题,再结合启动顺序和错误出现的时间来看,问题的关节点多半与连接数有关。结合这个结论,进入mysql后台,查看mysql最大连接数及当前连接数使用情况
show variables like '%max_connection%'; ----- 查看最大连接数(查询后默认值为:152)
查看当前mysql连接数使用情况:show status like 'Threads%';
Threads_cached 0
Threads_connected 151 --- 当前连接数
Threads_created 157 --- 创建过的线程数
Threads_running 1 --- 当前激活的连接数(数值一般小于connected)
从以上查询结果中可以看出,连接数已经达到上限了,所以后续第22个项目启动时,自然是无连接可用了,所以需重新设置一下mysql的最大连接上限了。
set global max_connections=1000; ----- 重新设置最大连接数(将连接上限改为:1000)
后续再次启动第22个项目成功了,那么证明后续项目也是同样原因造成的,直接逐一启动即可。
最后再次查看一下当前连接数:
Threads_cached 0
Threads_connected 189
Threads_created 193
Threads_running 1
结语:该问题存在诸多特殊性情况,单服模拟多项目分服拓展下造成了对同一mysql的大量连接。所以看了下网上的mysql版本原因对我并不适用,同时存在成功启动的项目,那么也在一方面证明了mysql是可用的,而结合连接数量的叠加以及启动顺序的差异,可以大概确认为mysql连接数上限存在问题。所以问题排查时需要先剖析问题本质,再对症下药。