Spring配置Hikari连接池解决并发请求连接耗尽超时问题
Hikari连接池满时的超时问题解决方案
澄清误解
你找的waiting_when_reached_max_connection这类配置是不存在的——HikariCP默认就会在连接池达到上限时,让后续请求排队等待可用连接。你看到的超时错误,不是因为没有等待,而是等待时间超过了设定的阈值。
错误日志解析
日志里的(total=100, active=100, idle=0, waiting=57)已经说明:
- 连接池总大小100,所有连接都处于活跃状态
- 没有空闲连接可用
- 有57个请求正在排队等待连接
- 这些请求等待了约5秒(5047ms)后仍未获取到连接,触发超时抛出异常
具体解决方案
调整连接等待超时时间
通过spring.datasource.hikari.connection-timeout配置延长等待时长,比如设置为60000(单位:毫秒,即1分钟):spring.datasource.hikari.connection-timeout=60000注意:不要设置过长,避免请求长时间挂起影响用户体验。
优化连接使用效率
- 确保连接用完即释放:使用
try-with-resources语法自动关闭连接/Statement/ResultSet,避免手动关闭遗漏导致连接泄漏 - 缩短连接持有时间:不要在数据库事务中执行非DB操作(比如调用外部API、文件IO),减少连接被占用的时间
- 确保连接用完即释放:使用
合理调整连接池大小
连接池不是越大越好,过大的池会增加数据库的上下文切换开销,反而降低性能。推荐参考公式:(CPU核心数 × 2) + 磁盘数量,比如8核服务器建议设置为17左右。需结合数据库的实际承载能力调整,而非盲目调大到100。检测连接泄漏
开启Hikari的连接泄漏检测,配置spring.datasource.hikari.leak-detection-threshold(单位:毫秒),当连接超过设定时间未释放时,会打印泄漏栈信息:spring.datasource.hikari.leak-detection-threshold=2000
内容的提问来源于stack exchange,提问作者Nguyen Manh Cuong
相关产品推荐
相关产品推荐

