Vert.x单线程服务高并发API调用响应变慢问题求助
解决方案
1. 修复数据库连接泄漏问题
你的代码获取数据库连接后未正确释放,导致连接池中的连接被长期占用,并发请求增多时会出现连接耗尽、请求排队等待的情况。必须确保连接使用完毕后归还池:
dbClient.getConnection().compose(conn -> testRepo.getListCities(conn) // 需确保Repo方法接收连接参数 .onComplete(ar -> { // 无论请求成功或失败,都要释放连接 conn.close(); if (ar.succeeded()) { response.end(Json.encodePrettily(ar.result())); } else { response.end(Json.encodePrettily("example exception")); } }) );
更优方案:直接使用池的查询方法,无需手动管理连接
Vert.x的Pool内置了连接管理逻辑,直接调用其查询方法可以自动获取/归还连接,彻底避免手动管理的疏漏:
// 调整Repo实现,直接使用Pool执行查询 testRepo.getListCities(dbClient) .onSuccess(data -> response.end(Json.encodePrettily(data))) .onFailure(throwable -> response.end(Json.encodePrettily("example exception")));
2. 调整数据库连接池大小
当前连接池maxSize=5,当并发请求达到8-10时,已超过池的最大连接数,后续请求必须等待空闲连接释放。根据你的并发需求调整池大小,同时注意不要超过数据库实例允许的最大连接数(PostgreSQL默认最大连接数为100):
final PoolOptions poolOptions = new PoolOptions() .setMaxSize(10) // 根据并发量调整,比如设置为10或更高 .setMinSize(5); // 配置最小空闲连接,减少连接创建开销
3. 排查数据库端瓶颈
如果修复连接泄漏、调整池大小后仍有问题,需检查数据库本身的性能:
- 查看数据库CPU、内存使用率,确认是否存在资源瓶颈
- 检查
getListCities对应的SQL查询是否添加了合适的索引,执行计划是否高效 - 监控数据库的连接队列,确认是否有请求在等待数据库连接
内容的提问来源于stack exchange,提问作者troonie-pham
相关产品推荐
相关产品推荐

