数据库连接池突发流量防护:Wait Timeout 导致请求堆积?动态扩容 + 排队熔断策略!
朋友公司大促期间,数据库连接池突然打满。所有需要数据库的请求都排队等连接,connection-timeout 设了 30 秒——等了 30 秒拿到连接的人还得用,30 秒拿不到的人直接报错。问题是那些等了 28 秒终于拿到连接的人,数据库早已经被前面的人压垮了,拿到连接也没用。400 个请求同时排队,300 个超时报错,100 个拿到连接但数据库响应时间从 5ms 飚到 500ms。 这不是数据库的问题,是连接池在突发流量面前没有自保能力。今天聊聊怎么用动态扩容和排队熔断,让连接池在洪峰到来时不崩溃。 问题:连接池是漏斗,不是水坝 连接池的设计初衷是"复用连接,避免频繁建连"。但它有一个致命假设:总有空闲连接可用。 突发流量一来,连接瞬间打满,后续请求只能排队。排队的请求占着 Tomcat 线程,Tomcat 线程也满了——连锁反应。 请求 → 连接池 → 没空连接 → 排队等 ↓ 排队占着 Tomcat 线程 ↓ Tomcat 线程池也满了 ↓ 新请求直接被拒 ↓ 整个服务不可用 连接池从"漏斗"变成了"堵点"。 方案一:动态扩容,峰值时多借几个连接 HikariCP 的 ....