druid 数据库宕库后重启,连接池无法创建新的连接

kd3sttzy  于 3个月前  发布在  Druid
关注(0)|答案(8)|浏览(61)

我们的项目用的是druid 连接池,我们做宕库测试时,发现了重启后连接池没法创建新的连接,一直报如下错误:
Caused by: com.alibaba.druid.pool.GetConnectionTimeoutException: wait millis 60000, active 0, maxActive 20, creating 0, createErrorCount 287
at com.alibaba.druid.pool.DruidDataSource.getConnectionInternal(DruidDataSource.java:1599) ~[rpc.register.server-1.4.0-SNAPSHOT.jar:?]
at com.alibaba.druid.pool.DruidDataSource.getConnectionDirect(DruidDataSource.java:1326) ~[rpc.register.server-1.4.0-SNAPSHOT.jar:?]
at com.alibaba.druid.filter.FilterChainImpl.dataSource_connect(FilterChainImpl.java:5007) ~[rpc.register.server-1.4.0-SNAPSHOT.jar:?]
at com.alibaba.druid.filter.stat.StatFilter.dataSource_getConnection(StatFilter.java:680) ~[rpc.register.server-1.4.0-SNAPSHOT.jar:?]
at com.alibaba.druid.filter.FilterChainImpl.dataSource_connect(FilterChainImpl.java:5003) ~[rpc.register.server-1.4.0-SNAPSHOT.jar:?]
at com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:1304) ~[rpc.register.server-1.4.0-SNAPSHOT.jar:?]
at com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:1296) ~[rpc.register.server-1.4.0-SNAPSHOT.jar:?]
at com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:109) ~[rpc.register.server-1.4.0-SNAPSHOT.jar:?]
at org.springframework.jdbc.datasource.DataSourceTransactionManager.doBegin(DataSourceTransactionManager.java:203) ~[rpc.register.server-1.4.0-SNAPSHOT.jar:?]
... 19 more
Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
at sun.reflect.GeneratedConstructorAccessor26.newInstance(Unknown Source) ~[?:?]
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[?:1.8.0_131]
at java.lang.reflect.Constructor.newInstance(Constructor.java:423) ~[?:1.8.0_131]

看了网上说的是版本低,可是我升级到1.1.14版本也有这个问题,试了1.1.2版本也有这个问题,不是偶发,多次测试都会复现,项目的并发也不高。请问什么原因?
我们的连接池配置:
maxActive=20
initialSize=3
maxWait=60000
minIdle=3
validationQuery=SELECT 1
timeBetweenEvictionRunsMillis=60000
minEvictableIdleTimeMillis=300000
testWhileIdle=true
testOnBorrow=true
testOnReturn=false
poolPreparedStatements=true
maxOpenPreparedStatements=20

jstack 部分信息:
"Druid-ConnectionPool-Create-1984094095": awaiting notification on [0x000000078c826f50]
at sun.misc.Unsafe.park(Native Method)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
at com.alibaba.druid.pool.DruidDataSource$CreateConnectionThread.run(DruidDataSource.java:2545)

使用数据库:mysql-5.5.54

请帮忙看看是什么原因,非常感谢!

f4t66c6m

f4t66c6m1#

@wenshao 帮忙看看是为什么? 非常感谢

3phpmpom

3phpmpom2#

数据库宕机后的重连一直存在,@wenshao,能否解决一下,德鲁伊号称是最好用的连接池啊

fiei3ece

fiei3ece3#

加上下面3个配置试试
参数  默认值  描述
removeAbandoned  false  标记是否删除泄露的连接,如果他们超过了removeAbandonedTimout的限制.
如果设置为true, 连接被认为是被泄露并且可以被删除,如果空闲时间超过removeAbandonedTimeout. 
设置为true可以为写法糟糕的没有关闭连接的程序修复数据库连接.
removeAbandonedTimeout  300  泄露的连接可以被删除的超时值, 单位秒
logAbandoned  false  标记当Statement或连接被泄露时是否打印程序的stack traces日志。
被泄露的Statements和连接的日志添加在每个连接打开或者生成新的Statement,
因为需要生成stack trace。

myzjeezk

myzjeezk4#

@ynshisss 这个我后来也加了,试了还是不行。

我的配置是:
removeAbandoned=true
removeAbandonedTimeout=60

z9ju0rcb

z9ju0rcb5#

@wenshao 求解,目前这个bug 解决了吗?

inkz8wg9

inkz8wg96#

@Force-King 使用配置类的方式配置数据源,每次执行事务前,通过切面判断数据源是否存在,不存在则重新创建。目前我们是这么处理的。

lh80um4z

lh80um4z7#

@Force-King 使用配置类的方式配置数据源,每次执行事务前,通过切面判断数据源是否存在,不存在则重新创建。目前我们是这么处理的。

这也是一种方式,感谢

o3imoua4

o3imoua48#

请问这个问题还继续存在么?

相关问题