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

Rust中Tokio_postgres执行简单查询时程序挂起问题求助

Rust tokio-postgres连接PostgreSQL后查询挂起的解决方案

你的程序挂起的核心原因是未正确管理tokio-postgres返回的连接任务conn。tokio-postgres的connect方法会返回两个对象:

  • client:用于执行查询的客户端实例
  • conn:负责处理连接底层IO的异步任务

一旦conn被丢弃(超出作用域),数据库连接会立即关闭,导致后续查询因无法与数据库交互而挂起,且不会抛出明显错误。

修正后的代码

#[tokio::main]
async fn main() {
    println!("Connecting to Postgres.");
    let (client, conn) = tokio_postgres::Config::new()
        .user("postgres")
        .password("postgres")
        .host("localhost")
        .port(9897)
        .dbname("postgres")
        .connect(tokio_postgres::NoTls)
        .await
        .unwrap();
    
    // 将conn的IO处理任务放到后台异步运行,避免被提前丢弃
    tokio::spawn(async move {
        if let Err(e) = conn.await {
            eprintln!("Connection error: {}", e);
        }
    });

    println!("Connected to Postgres.");

    let result = client.simple_query("SELECT 1 + 1;")
        .await
        .unwrap();
    
    println!("Query result: {:?}", result);
    println!("Query finished!");
}

关键说明

  • tokio::spawn会启动独立异步任务运行conn,让它持续处理数据库的消息交互,保证client的查询能正常完成。
  • 如果你的程序是长运行服务,也可以选择在main函数末尾添加conn.await;,让主线程等待连接任务结束,程序会一直运行到连接主动关闭。

额外验证点

  1. 确认Docker容器正常运行:执行docker ps查看postgres-server容器状态,确保端口9897已正确映射。
  2. M1环境下Docker的localhost映射默认正常,无需额外配置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 11:22:49