记druid 连接池没满,但超时问题
GetConnectionTimeoutException active 5, maxActive 100

问题说明

线上服务突然出现报错,通过日志查找发现是因为服务升级导致压力集中到某个节点上,出现连接获取超时导致的。
从日志中也找到了异常。
异常信息:

com.alibaba.druid.pool.GetConnectionTimeoutException: wait millis 6000, active 5, maxActive 100
----
但是从这个异常信息的描述来看,跟常规的线程池满又不一样,通过异常信息来看,线程池没满(active<maxActive),但是获取连接超时,有点无头脑。

正常的应该差不多是这样:

com.alibaba.druid.pool.GetConnectionTimeoutException: wait millis 6000, active 100, maxActive 100

-----

排查思路

怀疑1
线程池满超时,可以增加线程池大小。
但是现在线程池没满,缺又出现超时,首先排查数据库是否不正常。
经过排查,数据库没有限制连接数,其它服务、客户端也能正常使用。
排除数据库问题。

怀疑2
整个环境中也只有该服务因为使用量多而出现,并发量少了之后又恢复正常。
排除锁问题(就算出现锁,也应该把线程池占满)

因为是线上环境,无法简单去更换线程池等操作,一下就陷入到僵持。
druid github上类似问题也有很多人出现,早好几年前就有人提了该问题,但直到今天也没有解决答案。

定位

在一个个浏览github上相关问题时,突然发现某一个大神指出来,通过分析源码,该问题属于BUG,是一个提示性BUG。原因解释:
    出现 GetConnectionTimeoutException 就是代表获取线程池超时,线程池满了。 
    为什么提示又说线程池没满呢( active 5, maxActive 100 )?
    这是因为异常的日志打印没有放在同步块中,使用的变量没有考虑多线程。
    简单说就是,在打印日志时,变量(active)的值已被修改,所以不是异常发生时的值。
    代码大概如下:  DruidDataSource - 1394
---


  1.             if (holder == null) {
  2.             long waitNanos = waitNanosLocal.get();
  3.             StringBuilder buf = new StringBuilder();
  4.             buf.append("wait millis ")//
  5.                .append(waitNanos / (1000 * 1000))//
  6.                .append(", active ").append(activeCount)//
  7.                .append(", maxActive ").append(maxActive)//
  8.                .append(", creating ").append(creatingCount.get())//

;
---

问题重现

1. 在查询时特意的将时间延长,造成连接池被占用
2. 在异常打印日志之前增加一点延迟(比如打个断点)

结论

本身就是因为服务中出现了一些比较复杂耗时的SQL,导致长时间占用了连接。 
但是druid打印le 会产生歧义的异常,误导了问题分析的方向,增加了复杂度。

当前使用的druid版本是1.1.5,特意去瞄了一眼最新的代码(1.2.5),该代码还是没改。

[转帖]记druid 连接池没满,但超时问题 GetConnectionTimeoutException active 5, maxActive 100的更多相关文章

  1. 使用druid连接池的超时回收机制排查连接泄露

    起因:系统连接池满了 Exception wait millis 60012, active 2000, maxActive 2000, creating 0 加配置排查: <!-- 超过时间限 ...

  2. druid连接池获取不到连接的一种情况

    数据源一开始配置: jdbc.initialSize=1jdbc.minIdle=1jdbc.maxActive=5 程序运行一段时间后,执行查询抛如下异常: exception=org.mybati ...

  3. 使用druid连接池的超时回收机制排查连接泄露问题

    在工程中使用了druid连接池,运行一段时间后系统出现异常: Caused by: org.springframework.jdbc.CannotGetJdbcConnectionException: ...

  4. Druid连接池

    Druid 连接池简介 Druid首先是一个数据库连接池.Druid是目前最好的数据库连接池,在功能.性能.扩展性方面,都超过其他数据库连接池,包括DBCP.C3P0.BoneCP.Proxool.J ...

  5. 使用MyBatis集成阿里巴巴druid连接池(不使用spring)

    在工作中发现mybatis默认的连接池POOLED,运行时间长了会报莫名其妙的连接失败错误.因此采用阿里巴巴的Druid数据源(码云链接 ,中文文档链接). mybatis更多数据源参考博客链接 . ...

  6. spring+mybatis+c3p0数据库连接池或druid连接池使用配置整理

    在系统性能优化的时候,或者说在进行代码开发的时候,多数人应该都知道一个很基本的原则,那就是保证功能正常良好的情况下,要尽量减少对数据库的操作. 据我所知,原因大概有这样两个: 一个是,一般情况下系统服 ...

  7. SpringBoot配置MySql数据库和Druid连接池

    1.pom文件增加相关依赖 <dependency> <groupId>mysql</groupId> <artifactId>mysql-connec ...

  8. Java学习笔记42(数据库连接池 druid连接池)

    druid连接池: 是阿里的连接池,druid的稳定性及效率都很高,目前用的比较广,所以建议开发过程中尽量用druid连接池(支持国产最重要) druid连接池也需要配置文件,配置文件必须是prope ...

  9. springboot整合druid连接池、mybatis实现多数据源动态切换

    demo环境: JDK 1.8 ,Spring boot 1.5.14 一 整合durid 1.添加druid连接池maven依赖 <dependency> <groupId> ...

  10. springboot集成druid连接池

    使用druid连接池主要有几步: 1.添加jar和依赖 <groupId>org.mybatis.spring.boot</groupId> <artifactId> ...

随机推荐

  1. 10.elasticsearch集群red恢复损坏的索引

    背景 客户磁盘损坏,修复磁盘后,重启机器,发现elasticsearch启动成功,ES状态正常green,但是历史数据都没有加载进,查看ES存储数据目录,发现数据还在. 解决方案 首先,需要确认ind ...

  2. 文心一言 VS 讯飞星火 VS chatgpt (176)-- 算法导论13.3 5题

    五.用go语言,考虑一棵用 RB-INSERT 插人 n 个结点而成的红黑树.证明:如果 n>1,则该树至少有一个红结点. 文心一言: 要证明这个问题,我们首先需要理解红黑树的性质.红黑树是一种 ...

  3. 斯坦福 UE4 C++ ActionRoguelike游戏实例教程 02.AI自定义任务和观察器中断

    斯坦福课程 UE4 C++ ActionRoguelike游戏实例教程 0.绪论 概述 本文章对应课程第十一章 42节.这篇文章会进一步地为AI添加新功能,创建自定义任务,允许AI发射子弹,并且讲解观 ...

  4. VSCode C++开发环境配置: LLVM clang clangd

    工欲善其事,必先利其器 llvm/clang 比 VSCode 自带的代码提示功能速度更快,功能更强(支持 clang-tidy). 安装 llvm.clang sudo apt install ll ...

  5. 玩转GaussDB 中的SET操作符

    摘要:关系数据库中提供了一个关于集合的运算符SET操作符,其中包括以下操作:UNION/UNION ALL 并集.INTERSECT 交集.MINUS 差集. 本文分享自华为云社区<GaussD ...

  6. 梳理数仓FI manager节点健康检查逻辑

    摘要:一篇记录FI Manager节点健康检查机制的博文. 本文分享自华为云社区<GaussDB(DWS) FI manager节点健康检查逻辑梳理>,作者:配音师 . 一.相关背景 1. ...

  7. java并发编程(1):Java多线程-基本线程类-基础知识复习笔记

    复习资料:<同步与异步:并发/并行/进程/线程/多cpu/多核/超线程/管程 > 基本线程类 基本线程类 基本线程类指的是Thread类,Runnable接口,Callable接口 继承T ...

  8. Markdown 图片居中显示,增加图片说明

    <center> <img src="https://img2023.cnblogs.com/blog/80824/202308/80824-202308081307138 ...

  9. SQL SERVER数据分组后取第一条数据——PARTITION BY

    MySQL 数据分组后取第一条数据 SQL SERVER (mssql) 数据分组后取第一条数据 SQL 如下 找状态=1的数据,按 HospitalId,DeptId 组合并倒序排序,每组里面取第一 ...

  10. OpenFeign 各种用法、 logger 日志记录

    <spring-cloud-openfeign.version>2.2.6.RELEASE</spring-cloud-openfeign.version>对应的SpringB ...