生产环境发现Communications link failure

作者 mysql 2021年09月07日 14:43 阅读 821

生产环境mysql出现 Communications link failure 问题处理记录 Could not get JDBC Connection; nested exception is com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

一、先说解决方案:

1。调大mysql连接数目, 由于没有权限修改数据库配置文件,只能使用sql修改了最大连接数 (最大值不能超过16384,超过也以16384为准;).

     在本项目中,我们是写一个mysql event事件,定时更新最大连接数为8048。 

    set GLOBAL max_connections=8048 ; 

 

     适当调大connect_timeout 的值 ,等待其它查询进程释放连接。可加到jdbc连接的配置的配置文件中,也可改数据库中的配置

     set GLOBAL connect_timeout=20;  

      这个值最好是在jdbc的url参数中,在有些共享数据库的情况中,有些微服务可能需要快速失败。connectTimeout=20;

2。排查java程序中的数据库连接,减少不必要的查询

     调整springboot配置添加连结检测相配置 

# 用于测试连接是否可用的查询语句
spring.datasource.hikari.connection-test-query=SELECT 1
spring.datasource.validation-query=SELECT 1

 

二、排查过程:

客户返回近期统计报表数据缺失。系统中的数据报表是由xxl-job的定时任务定时汇总的,查了一下任务后台日志发现异常信息中存在.CommunicationsException: Communications link failure 。确定是mysql连接无法获取造成的。

于是检查了以下配置:

1。查看mysql连接数:  show variables like '%conn%' ;   发现最大连接数据为2048 

     查看连接超时时间:   show variables like '%timeout%' ;   发现connect_timeout为10  ,connect_timeout指的是连接过程中握手的超时时间,在5.0.52以后默认为10秒。

2。xxl-job客户端,启动了5个实例,每个实例配置了连接池最大数配置的1000,没有在url中添加连接超时时间。

3。检查程序,每次定时任务要对2000个以上的站点数据分片到各个实例后,依次逐个汇总。每个站点内部又进行了多次其它汇总。

2023-01-11 03:10:50.703 [Thread-196] ERROR c.d.dpc.service.PStatPowerStatHourByDayService - XXXXXXXXXXXXXXXXXXXXXXXXXX{}
org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

Last packet sent to the server was 0 ms ago.
    at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:80)
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:394)
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:443)
    at com.dpcsys.dpc.dao.JdbcDao.execSql(JdbcDao.java:172)
    at com.dpcsys.dpc.dao.JdbcDao$$FastClassBySpringCGLIB$$8eb61d39.invoke(<generated>)
    at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:738)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:136)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:673)
    at com.dpcsys.dpc.dao.JdbcDao$$EnhancerBySpringCGLIB$$5880ef42.execSql(<generated>)
    at com.dpcsys.dpc.service.PStatPowerStatHourByDayService.PStatPowerStatHourByDay(PStatPowerStatHourByDayService.java:93)
    at com.dpcsys.dpc.task.PStatPowerAllHandler.doMyJob(PStatPowerAllHandler.java:106)
    at com.dpcsys.dpc.task.PStatPowerAllHandler.execute(PStatPowerAllHandler.java:83)
    at com.xxl.job.core.thread.JobThread$1.call(JobThread.java:134)
    at com.xxl.job.core.thread.JobThread$1.call(JobThread.java:131)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.lang.Thread.run(Thread.java:748)
Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

Last packet sent to the server was 0 ms ago.
    at sun.reflect.GeneratedConstructorAccessor54.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:406)
    at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1074)
    at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2103)
    at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:718)
    at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:46)
    at sun.reflect.GeneratedConstructorAccessor52.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:406)
    at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:302)
    at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:282)
    at org.apache.tomcat.jdbc.pool.PooledConnection.connectUsingDriver(PooledConnection.java:310)
    at org.apache.tomcat.jdbc.pool.PooledConnection.connect(PooledConnection.java:203)
    at org.apache.tomcat.jdbc.pool.PooledConnection.reconnect(PooledConnection.java:361)
    at org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:821)
    at org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:651)
    at org.apache.tomcat.jdbc.pool.ConnectionPool.getConnection(ConnectionPool.java:198)
    at org.apache.tomcat.jdbc.pool.DataSourceProxy.getConnection(DataSourceProxy.java:132)
    at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:111)
    at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:77)
    ... 18 common frames omitted
Caused by: java.net.ConnectException: Connection refused (Connection refused)

 

发表评论