数据库连接断开CommunicationsException:

2020-10-21  本文已影响0人  孤帆逐影

相信很多同学遇到过数据库连接池超时的异常

Communications link failure

The last packet successfully received from the server was 1,008 milliseconds ago.  The last packet sent successfully to the server was 1,002 milliseconds ago.

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

The last packet successfully received from the server was 1,008 milliseconds ago.  The last packet sent successfully to the server was 1,002 milliseconds ago.

异常的原因很简单,本地连接池维持的连接超过数据库的超时时间,例如数据库配置900秒超时,druid 默认空闲连接超时时间7个小时

这里涉及到几个核心参数

#连接数配置 空闲最小 空闲最大 最多连接数 初始化连接数 

druid.minIdle=4

druid.maxIdle=8

druid.maxActive=40

druid.initialSize=10

#配置获取连接等待超时的时间

druid.maxWait=900

#检测sql  用连接,还连接,空闲时三个检测

druid.validationQuery="select 1"

druid.testOnBorrow=true

druid.testOnReturn=false

druid.testWhileIdle=true

#配置一个连接在池中最小生存的时间,单位是毫秒

druid.minEvictableIdleTimeMillis=30000

druid.maxEvictableIdleTimeMillis=600000

#配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒

druid.timeBetweenEvictionRunsMillis=6000

一般来讲需要调整这几个参数来包装连接有效性。

建议使用连接和空闲时检测打开即可,归还时检测没必要。

最大空闲时长肯定大于最小空闲时常,这里有个建议 最大空闲+间隔检测时常<数据库超时。

关于具体销毁创建连接介绍可以看下这个

https://www.jianshu.com/p/e7a1300f4250

我这边也遇到这个问题,看了下druid监控页面最大maxEvictableIdleTimeMillis用的默认7小时,肯定是不合理的。

但是公司把druid做了一层包装,但是参数又没能透传到druid,修改包装源码又不好弄。所以另辟蹊径

启动参数加上。再去druid监控看了下成功改掉。

-Ddruid.maxEvictableIdleTimeMillis=800000 -Ddruid.minEvictableIdleTimeMillis=60000

另:

可以通过控制keeplive 但是要求版本

https://github.com/alibaba/druid/wiki/KeepAlive_cn

github打开慢的可以直接看下面

在Druid-1.0.27之前的版本,DruidDataSource建议使用TestWhileIdle来保证连接的有效性,但仍有很多场景需要对连接进行保活处理。在1.0.28版本之后,新加入keepAlive配置,缺省关闭。使用keepAlive功能,建议使用最新版本,比如1.1.21或者更高版本

打开KeepAlive之后的效果

初始化连接池时会填充到minIdle数量。

连接池中的minIdle数量以内的连接,空闲时间超过minEvictableIdleTimeMillis,则会执行keepAlive操作。

当网络断开等原因产生的由ExceptionSorter检测出来的死连接被清除后,自动补充连接到minIdle数量。

配置方法

通过JVM启动参数配置

-Ddruid.keepAlive=true

通过Spring配置

<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">

    <property name="keepAlive" value="true" />

</bean>

通过Spring配置connectionProperties

<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">

    <property name="connectionProperties" value="keepAlive=true" />

</bean>

上一篇 下一篇

猜你喜欢

热点阅读