Skip to main content

koprogo_api/infrastructure/database/
pool.rs

1//! Le pool de connexions à la base.
2//!
3//! Un second `create_pool` a longtemps vécu dans `src/db.rs`, plafonné à cinq
4//! connexions et sans réglage de délai. Il n'était déclaré dans aucun `mod`,
5//! donc jamais compilé ni appelé — mais il se lisait comme la configuration du
6//! pool, et quiconque cherchait à régler les connexions tombait dessus en
7//! premier. Supprimé (#720) : deux définitions du même nom, dont l'une inerte,
8//! sont plus trompeuses qu'un fichier manquant.
9//!
10//! Les réglages sont pilotés par l'environnement, avec des valeurs par défaut
11//! prudentes plutôt qu'optimales — un pool trop large sur un VPS partagé épuise
12//! les connexions du serveur avant celles de l'application.
13
14use sqlx::postgres::PgPoolOptions;
15use sqlx::{Pool, Postgres};
16use std::env;
17use std::time::Duration;
18
19pub type DbPool = Pool<Postgres>;
20
21pub async fn create_pool(database_url: &str) -> Result<DbPool, sqlx::Error> {
22    let max_connections = env::var("DB_POOL_MAX_CONNECTIONS")
23        .unwrap_or_else(|_| "10".to_string())
24        .parse::<u32>()
25        .unwrap_or(10);
26
27    let min_connections = env::var("DB_POOL_MIN_CONNECTIONS")
28        .unwrap_or_else(|_| "2".to_string())
29        .parse::<u32>()
30        .unwrap_or(2);
31
32    let acquire_timeout = env::var("DB_POOL_ACQUIRE_TIMEOUT")
33        .unwrap_or_else(|_| "30".to_string())
34        .parse::<u64>()
35        .unwrap_or(30);
36
37    log::info!(
38        "Creating database pool: max_connections={}, min_connections={}, acquire_timeout={}s",
39        max_connections,
40        min_connections,
41        acquire_timeout
42    );
43
44    PgPoolOptions::new()
45        .max_connections(max_connections)
46        .min_connections(min_connections)
47        .acquire_timeout(Duration::from_secs(acquire_timeout))
48        .idle_timeout(Duration::from_secs(600)) // 10 minutes
49        .max_lifetime(Duration::from_secs(1800)) // 30 minutes
50        .connect(database_url)
51        .await
52}