线上问题处理案例:出乎意料的数据库连接池

💡 原文中文,约2200字,阅读约需6分钟。
📝

内容提要

本文介绍了一起线上问题处理案例,通过排查垃圾回收耗时过长的表象,逐步定位到数据库连接池保活问题。最终提出了两种解决方案。

🎯

关键要点

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

继续阅读