美文网首页
数据库连接断开CommunicationsException:

数据库连接断开CommunicationsException:

作者: 孤帆逐影 | 来源:发表于2020-10-21 15:47 被阅读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>

相关文章

网友评论

      本文标题:数据库连接断开CommunicationsException:

      本文链接:https://www.haomeiwen.com/subject/mncemktx.html