基本 connect(立即建立並嘗試連線):
use sqlx::PgPool;
let pool = PgPool::connect("postgres://user:pw@localhost/db").await;
connect_lazy(建立 pool handle,但不立即建立實際連線,直到第一次使用):
let pool = PgPool::connect_lazy("postgres://user:pw@localhost/db");
connect_lazy 可讓應用啟動更快(不等待 DB 可用),但第一次請求會承擔建立連線的延遲。
使用 PgPoolOptions::new()(使用 builder pattern 的好處:可設定多種參數):
use sqlx::postgres::PgPoolOptions;
use std::time::Duration;
let pool = PgPoolOptions::new()
.max_connections(10)
.connect_timeout(Duration::from_secs(5))
.connect("postgres://user:pw@localhost/db").await;
下面列出常用的配置與實務建議數值(需依業務/DB 能力調整):
把 PgPool 放到 axum::Extension(shared state):
use axum::{Router, Extension};
use sqlx::PgPool;
let pool: PgPool = /* 建好 */;
let app = Router::new()
.layer(Extension(pool));
在 handler 裡使用 Extension extractor:
use axum::extract::Extension;
use sqlx::PgPool;
async fn handler(Extension(pool): Extension<PgPool>) -> String {
// 使用 pool
let rec = sqlx::query!("SELECT 1 as v")
.fetch_one(&pool)
.await
.unwrap();
format!("v = {}", rec.v)
}
設計要點: