有人在群里喊数据库链接数不够了,要调大,听上去不怎么靠谱,跟进了一下。
- A: 是xxx数据库吗?
- B: 是mysql数据库
- A: 用xxx管理连接吗?
- B: 不是
- A: 前面讨论close wait是tcp状态吗?
- B: 是
- A: tcp状态在db端看到还是应用服务器?
- B: 应用服务器。
- A: 那应该是mysql主动关闭呀
- A: 应用服务器看到的tcp连接是来自客户端还是到db的?
- B: 来自客户端
- A: 哦,应该是客户端主动关闭。原因可能是应用服务器超时没响应,超时原因有很多,可能是应用服务器线程被阻塞,阻塞一般都是在等待资源,资源可能是一把锁、一个数据库链接或其他。超时还可能是应用服务器处理速度变慢,处理速度慢也是资源紧张,资源可能是内存、CPU、外部IO。
- B: 哦,看看吧,先赌一把数据库链接不够。
- A: 如果是数据库链接,忘关的可能性大,或者死锁。只调大还不行,要在连接池加上自动释放,锁加上不等待。最终还是要排查真正原因,解决掉。
在这个处理过程中,A尽量做到思维严谨,不过还有改进空间。
- 这个问题可以改成开放式,“什么数据库?"
- 同样改成开放式,”用什么管理数据库链接?“
- 这里思维跳了一下,前面并没说tcp 链接是到mysql的
- 对连接池管理不是非常熟悉,没法凭直接指引方向了。
总结下来,要像高手一样灰飞烟灭间扫除问题,需要严谨的逻辑推理+丰富实战经验培养的直觉。