相信很多同学遇到过数据库连接池超时的异常
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或者更高版本
初始化连接池时会填充到minIdle数量。
连接池中的minIdle数量以内的连接,空闲时间超过minEvictableIdleTimeMillis,则会执行keepAlive操作。
当网络断开等原因产生的由ExceptionSorter检测出来的死连接被清除后,自动补充连接到minIdle数量。
-Ddruid.keepAlive=true
<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>
网友评论