问题描述
系统某个时间段有大量数据库操作,此时页面偶尔就要出现卡死现状
原因分析:
- 毫无疑问,这是由于数据库连接不够用,正常来讲加连接就行
- 但是由于也就只有这个时间段需要用到很多连接,平时更多都是10几个连接够用,加连接感觉太浪费
- 页面卡死可能是获取不到连接,于是加了 max-wait 配置,获取链接的超时时间
- 设置了后发现问题依旧没有解决,本地实验了后发现 max-wait 确实不生效
解决方案:
1. 查看 max-wait 使用的代码
这个方法作用是从池子中获取最后一个链接,当池子中没有链接的时候,阻塞该线程,当创建新连接或者归还连接时通知阻塞线程,所以单纯看这段代码逻辑 max-wait 的实现是没有问题的
2. 查看 max-wait 前置代码
实际调试后发现当链接满时,继续执行数据库操作不会跳到获取链接的方法中来
这里的这段代码就是说如果链接已满,就会无限循环,所以根本就不会去获取链接了,因此导致了死循环
3. 查询资料解决
最终在官方中找到了该问题,去年12月时更新导致的,还是比较坑的
https://github.com/alibaba/druid/issues/5495
4. 经验教训
任何配置都应该实验一遍出效果再用,如果有时间就得看下该配置在源码中是如何使用的,一般都不会太复杂,也不是很费时间。同时也要注意有时你通过配置解决了一个问题,有可能是个偶然,实际能不能解决应该去研究代码逻辑在该配置下是否能按照需要的执行