美文网首页
数据库连接断开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