koprogo_api/infrastructure/database/
pool.rs

1use sqlx::postgres::PgPoolOptions;
2use sqlx::{Pool, Postgres};
3use std::env;
4use std::time::Duration;
5
6pub type DbPool = Pool<Postgres>;
7
8pub async fn create_pool(database_url: &str) -> Result<DbPool, sqlx::Error> {
9    let max_connections = env::var("DB_POOL_MAX_CONNECTIONS")
10        .unwrap_or_else(|_| "10".to_string())
11        .parse::<u32>()
12        .unwrap_or(10);
13
14    let min_connections = env::var("DB_POOL_MIN_CONNECTIONS")
15        .unwrap_or_else(|_| "2".to_string())
16        .parse::<u32>()
17        .unwrap_or(2);
18
19    let acquire_timeout = env::var("DB_POOL_ACQUIRE_TIMEOUT")
20        .unwrap_or_else(|_| "30".to_string())
21        .parse::<u64>()
22        .unwrap_or(30);
23
24    log::info!(
25        "Creating database pool: max_connections={}, min_connections={}, acquire_timeout={}s",
26        max_connections,
27        min_connections,
28        acquire_timeout
29    );
30
31    PgPoolOptions::new()
32        .max_connections(max_connections)
33        .min_connections(min_connections)
34        .acquire_timeout(Duration::from_secs(acquire_timeout))
35        .idle_timeout(Duration::from_secs(600)) // 10 minutes
36        .max_lifetime(Duration::from_secs(1800)) // 30 minutes
37        .connect(database_url)
38        .await
39}