Rust中Diesel连接Postgres报错:客户端连接数过多求助
问题排查与解决方案
核心可能原因及修复
1. Diesel版本与rocket_sync_db_pools不兼容
rocket_sync_db_pools 0.1.x(适配Rocket 0.5)目前依赖Diesel 1.x,如果你的Cargo.toml中使用了Diesel 2.x,会导致连接池无法正确管理连接,出现无限制创建连接直到耗尽Postgres连接数的情况。
修复方案:
将Diesel版本降级到1.x,同时确保启用对应特性:
# Cargo.toml 中相关依赖调整 diesel = { version = "1.4.8", features = ["postgres", "uuid", "serde_json"] } rocket_sync_db_pools = { version = "0.1.0", features = ["diesel_postgres_pool"] }
2. 检查Postgres连接数实际使用情况
即使你认为没有其他应用占用连接,也需要确认Postgres当前的连接数:
- 打开psql终端,执行:
SELECT count(*) FROM pg_stat_activity; - 如果启动程序前连接数已经接近100,说明有隐藏的连接占用(比如之前程序崩溃未释放的连接,或Postgres自身的连接),可以重启Postgres释放所有连接。
3. 避免重复添加数据库Fairing
检查你的代码中是否多次调用Db::fairing(),比如在多个Stage中重复attach。每个数据库连接池只需要attach一次,重复attach会创建多个独立的连接池,快速耗尽连接数。
从你的代码看,resources::file_resource::stage()中已经attach了Db::fairing(),确保主启动函数中没有再次attach该Fairing。
4. 验证Postgres配置是否生效
- 确认你修改的
postgresql.conf是Postgres实际加载的配置文件(不同安装方式路径不同,比如Docker容器内路径为/var/lib/postgresql/data/postgresql.conf)。 - 修改
max_connections后必须重启Postgres才能生效。 - 执行以下命令验证当前生效的配置:
SHOW max_connections;
额外建议
- 启动程序时,用
watch命令实时监控Postgres连接数,观察连接数变化:
如果启动程序后连接数瞬间飙升到100,说明代码存在连接泄漏或连接池管理异常,优先检查Diesel版本兼容性。watch -n 1 "psql -U postgres -d diesel -c 'SELECT count(*) FROM pg_stat_activity;'"
内容的提问来源于stack exchange,提问作者senfo
相关产品推荐
相关产品推荐

