某天晚上,突然收到运维同事反馈说系统告警,A系统调用B系统出现大量超时,通过日志分析,B系统中出现了大量的mysql连接报错信息,但是却没有收到任何http请求,怀疑是线程阻塞,运维人员进行了线上的重启操作,系统恢复,开始了问题的追溯。
查看日志中的数据库报错,首先确定问题的源头是出在数据库上面,相关报错日志如下(已屏蔽敏感信息):
到此时,已经基本确定问题就出在服务端系统,也就是B系统,虽然从日志和热力图的现象都表明B系统没有收到任何请求,但是从线程池的表现来看,这是进入了排队等待的状态,当活跃线程数量达到上限时,系统就停止响应了。
进一步分析代码,发现当maxWait为初始值是会执行takeLast方法,该方法会调用线程的await方法获取可用连接,而数据库可用连接为0则会导致该操作一直lock住,从而使得线程挂起。
看到此处,是不是已经豁然开朗,那么我们解决问题的思路也就有了。
只要问题分析清楚了,解决问题有时候其实是一件很容易的事情,通过上面的分析我们得知,druid在获取不到可用连接时,会有一个超时时间,这个超时时间就是maxWait,也就是说,只需要将maxWait设置为一个值,那么我们就可以在数据库出现故障时,快速的失败返回,由于使用的springboot的starter方式引入,我们可以直接在springboot的yml配置(笔者所在公司使用的携程apollo配置中心,且统一框架内嵌druid默认配置)中添加如下参数即可:
到此这篇druid数据库连接池阻塞(druid连接池github)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!
版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/sjkxydsj/44622.html