[alibaba/druid]activeCount大于maxActive

2025-11-11 965 views
2

druid 版本 1.1.22 mysql-connector-java 版本 8.0.17

错误1

Caused by: com.alibaba.druid.pool.GetConnectionTimeoutException: wait millis 1500, active 199, maxActive 64, creating 0 at com.alibaba.druid.pool.DruidDataSource.getConnectionInternal(DruidDataSource.java:1730) at com.alibaba.druid.pool.DruidDataSource.getConnectionDirect(DruidDataSource.java:1397) at com.alibaba.druid.filter.FilterChainImpl.dataSource_connect(FilterChainImpl.java:5059) at com.alibaba.druid.filter.stat.StatFilter.dataSource_getConnection(StatFilter.java:680) at com.alibaba.druid.filter.FilterChainImpl.dataSource_connect(FilterChainImpl.java:5055) at com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:1374) at com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:1366) at com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:79) at org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource.getConnection(AbstractRoutingDataSource.java:164) at org.apache.shardingsphere.shardingjdbc.jdbc.core.connection.ShardingConnection.createConnection(ShardingConnection.java:74) at org.apache.shardingsphere.shardingjdbc.jdbc.adapter.AbstractConnectionAdapter.createConnections(AbstractConnectionAdapter.java:143) ... 122 common frames omitted

错误2 Caused by: java.sql.SQLException: statement is closed at com.alibaba.druid.pool.DruidPooledStatement.checkOpen(DruidPooledStatement.java:182) at com.alibaba.druid.pool.DruidPooledStatement.getResultSet(DruidPooledStatement.java:643) at org.apache.shardingsphere.shardingjdbc.jdbc.core.statement.ShardingPreparedStatement.getResultSet(ShardingPreparedStatement.java:140) at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.getFirstResultSet(DefaultResultSetHandler.java:237) at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleResultSets(DefaultResultSetHandler.java:187) at org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:65) at org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:79) at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:63) at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:324) at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:156) at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:109) at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:83) at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147) at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:140) at sun.reflect.GeneratedMethodAccessor285.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:426) ... 91 common frames omitted

错误一旦出现,一直持续,必须重启机器才能恢复

回答

5

@wenshao active为啥还会大于maxActive

4

@wenshao @BruceZhangXL 请问后面有结果了嘛?我们这边也遇到这个问题了。使用的是druid 1.2.3。同样的代码,预发布环境报这个问题,生产和开发测试环境都没有这问题。

我用 arthas 修改了 maxActive 之后 getConnection 就能正常获取了,一会后 activeCount - 1 (达到回收时间)。

9

@wenshao @BruceZhangXL 请问后面有结果了嘛?我们这边也遇到这个问题了。使用的是druid 1.2.3。同样的代码,预发布环境报这个问题,生产和开发测试环境都没有这问题。

我用 arthas 修改了 maxActive 之后 getConnection 就能正常获取了,一会后 activeCount - 1 (达到回收时间)。

我使用 jmap 或者 arthas 的 vmtool 统计了连接实例始终没有 11 个,就 1~2个,druidDataSource 里的 connection 也是只有 2 个,但 activeCount 确是 11。

我又继续看了一下,从 druid 1.1.21 版本开始,新增了一个 discardConnection(DruidConnectionHolder holder) 方法,所有连接废弃操作都改成调用这个方法,但是有个问题就是方法传入 null 的时候不会将 activeCount - 1。而是直接结束方法执行。

我会考虑将 druid 版本降低到 1.1.20 尝试验证是否依然存在此问题。

7
https://github.com/alibaba/druid/releases/tag/1.2.6

1.2.6版本已修复这个问题,原因是是其中的第4个issue : 修复连接池在timeBetweenEvictionRunsMillis大于keepAliveBetweenTimeMillis时异步使用连接会导致连接池不可用的问题。