You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SpringBoot单实例压测150请求遇PostgreSQL query_wait_timeout问题咨询

问题描述

我使用SpringBoot应用搭配Azure上的PostgreSQL数据库,通过JMeter做负载测试:

  • 并发100个请求访问单个API接口时正常运行
  • 并发150个请求时出现错误
  • 应用自动扩缩至2个实例时,150个请求可正常执行,但单实例状态下触发如下错误日志:
2022-12-21 17:29:43.000  WARN 1 --- [http-nio-8080-exec-60] o.h.engine.jdbc.spi.SqlExceptionHelper   : SQL Error: 0, SQLState: 08P01
2022-12-21 17:29:43.000 ERROR 1 --- [http-nio-8080-exec-60] o.h.engine.jdbc.spi.SqlExceptionHelper   : FATAL: query_wait_timeout
2022-12-21 17:29:43.000  WARN 1 --- [http-nio-8080-exec-60] o.h.engine.jdbc.spi.SqlExceptionHelper   : SQL Error: 0, SQLState: 08006
2022-12-21 17:29:43.001 ERROR 1 --- [http-nio-8080-exec-60] o.h.engine.jdbc.spi.SqlExceptionHelper   : An I/O error occurred while sending to the backend.
2022-12-21 17:29:43.090  WARN 1 --- [http-nio-8080-exec-61] o.h.engine.jdbc.spi.SqlExceptionHelper   : SQL Error: 0, SQLState: 08P01
2022-12-21 17:29:43.090 ERROR 1 --- [http-nio-8080-exec-61] o.h.engine.jdbc.spi.SqlExceptionHelper   : FATAL: query_wait_timeout

需要明确:

  1. 该问题属于内存问题还是数据库问题?
  2. 如何解决该问题?
问题分析与解决方案

1. 问题类型判定

这是数据库相关问题,并非应用内存问题:

  • 错误日志中明确出现FATAL: query_wait_timeout,这是PostgreSQL的查询等待超时错误,意味着数据库无法及时处理排队的查询请求,导致请求超时被终止;
  • 应用扩缩到2个实例后,请求被分摊到两个实例,每个实例发起的数据库请求量减少,数据库能承受,因此恢复正常;
  • 内存问题通常会伴随OutOfMemoryError等日志,当前日志中无相关信息,可排除内存问题。

2. 解决方法

(1)调整PostgreSQL的query_wait_timeout参数

query_wait_timeout控制查询在数据库队列中等待执行的最长时间,默认值可能较短。可以在Azure门户中找到对应的PostgreSQL实例,进入“服务器参数”页面,将该参数调大(比如从默认的5秒调整为10-15秒),给数据库足够的时间处理排队请求。

(2)优化数据库连接池配置

Spring Boot默认使用HikariCP连接池,调整以下参数避免单实例发起过多数据库连接:

  • spring.datasource.hikari.maximum-pool-size:根据数据库的最大连接数限制合理设置,避免连接数耗尽导致请求排队;
  • spring.datasource.hikari.connection-timeout:调整连接超时时间,适配数据库的处理能力。

(3)优化API对应的SQL查询

检查该接口执行的SQL是否存在性能瓶颈:

  • 使用EXPLAIN分析SQL执行计划,查看是否存在全表扫描、缺少索引等问题;
  • 给查询字段添加合适的索引,减少单条SQL的执行时间,提升数据库的并发处理能力。

(4)调整应用实例的并发配置

限制单实例的并发请求数,避免瞬间发起过多数据库请求:

  • 修改Spring Boot的Tomcat线程配置:server.tomcat.max-threads,设置合理的最大值(比如200以内),让请求在应用层排队,避免压垮数据库。

(5)升级Azure PostgreSQL实例规格

如果数据库本身的CPU、内存资源不足,无法支撑高并发请求,可以考虑升级Azure PostgreSQL的实例规格,选择更高配置的虚拟机类型,提升数据库的整体处理能力。


内容的提问来源于stack exchange,提问作者Keshav Sahu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 23:15:29