Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException:

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连接数上限存在问题。所以问题排查时需要先剖析问题本质,再对症下药。