工作笔记(一):Druid连接池未正确设置参数导致的阻塞问题分析

  • 背景

    最近和其他组的小伙伴在联调施工代码时,发现工单下发后一直阻塞在组件控制台几个小时都没有返回,查看日志后发现是后端数据库挂掉的原因,但是按照之前使用的情况,spring boot 默认情况下数据库连不上是会直接返回。针对该情况本地启动原项目代码进行模拟

  • 问题排查

    1. 先关闭后端测试库,调用下单接口,这里使用的是idea自带的http client来发送请求,然后进入阻塞

      image-20211222162624088

    1. 使用jps查找对应的java进程,获取pid

      image-20211222163606235

    2. 通过jstack保存线程快照

      image-20211222163640655

    3. 在堆栈信息中,根据内部方法名找到阻塞的线程,然后查找到阻塞的位置,一般是等待锁或者根据某些条件进入等待。最终确定问题为调用了druid连接池的takeLast()方法,后续触发了某个条件变量(结合环境来看,现在连接池没有连接,应该是notEmpty条件)的await方法,从而进入条件队列阻塞

      image-20211222163832057

      image-20211222164044386

    4. 查看对应的源码来查找具体原因,最终发现,当maxWait这个变量<0时,就会进入无超时设置的获取,连接池为空时一直阻塞。

      image-20211222164913120

    image-20211222165238936

  1. 翻阅其他同事设置druid数据源的代码,发现确实没有设置maxWait这个变量,好吧找到问题了,可以进行批斗了。。

  2. 因为记得之前使用spring默认配置时获取连接失败是不会阻塞的,故去掉druid使用默认的hikari连接池继续测试,实验结果与预期一致,翻看相关代码确实也没有相关的条件变量属性。

  • 总结

    使用druid作为数据库连接池时一定要对必要的属性根据环境进行合适的设置,防止出现一些隐藏bug,而经过对比验证,大胆猜测druid的开发者是认为后端数据库一般是在用户自定义的maxWait时间内可以恢复所以设置对应的阻塞操作,使得相关调用尽可能的返回结果,对调用方比较友好

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值