线上问题处理案例:出乎意料的数据库连接池
💡
原文中文,约2200字,阅读约需6分钟。
📝
内容提要
本文介绍了一起线上问题处理案例,通过排查垃圾回收耗时过长的表象,逐步定位到数据库连接池保活问题。最终提出了两种解决方案。
🎯
关键要点
- 本文介绍了一起线上问题处理案例,定位到数据库连接池保活问题。
- 大促期间,某接口超时次数增多,GC耗时过长是直接原因。
- 应用基本情况包括容器配置、JVM配置、数据库类型和连接池类型。
- 排查过程中发现内存中垃圾对象多,初步排除内存泄漏。
- 通过堆dump分析发现很多失效数据库连接进入老年代,导致FullGC耗时过长。
- 连接池验证周期过长,调整参数后问题依旧。
- 阅读DBCP源码发现连接空闲时间未重新计算,导致连接在业务低谷时被淘汰。
- 大促期间业务量大,GC频繁,过期连接在老年代被回收,导致接口超时。
- 确认问题原因是数据库连接池不具备保活能力,导致连接不断淘汰和新建。
- 提出两种解决方案:改为G1回收器或将minEvictableIdleTimeMillis设置为0。
- 总结数据库连接池不具备保活能力,连接在不活跃时会被淘汰和重连。
- 拓展知识点包括Druid连接池的保活问题、虚引用对GC的影响等。
➡️