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;,让主线程等待连接任务结束,程序会一直运行到连接主动关闭。
额外验证点
- 确认Docker容器正常运行:执行
docker ps查看postgres-server容器状态,确保端口9897已正确映射。 - M1环境下Docker的localhost映射默认正常,无需额外配置。
内容的提问来源于stack exchange,提问作者jotjern
相关产品推荐
相关产品推荐

