池连接会重试被拒绝的连接,但在手shake 中间丢弃一个连接时立即放弃。
use std::time::{Duration, Instant}; use tokio::io::AsyncReadExt; use tokio::net::TcpListener;
async fn eof_server() -> u16 { let l = TcpListener::bind("127.0.0.1:0").await.unwrap(); let port = l.local_addr().unwrap().port(); tokio::spawn(async move { loop { let (mut s, _) = l.accept().await.unwrap(); let mut b = [0u8; 8]; let _ = s.read_exact(&mut b).await; drop(s); } }); port }
async fn refused_port() -> u16 { let l = TcpListener::bind("127.0.0.1:0").await.unwrap(); let port = l.local_addr().unwrap().port(); drop(l); port }
async fn go(port: u16) -> (Duration, String) { let t = Instant::now(); let e = sqlx::postgres::PgPoolOptions::new() .max_connections(1) .acquire_timeout(Duration::from_secs(5)) .connect(&format!("postgres://u:[email protected]:{port}/d")) .await .map(|_| "Ok".into()) .unwrap_or_else(|e| format!("{e:?}")); (t.elapsed(), e) }
#[tokio::main] async fn main() { let (d, e) = go(eof_server().await).await; println!("accept-then-close -> {e} after {d:?}"); let (d, e) = go(refused_port().await).await; println!("connection refused -> {e} after {d:?}"); }
内容来源: transact-rs/sqlx