feat(server): configurable DB pool size via --db-max-connections/DB_MAX_CONNECTIONS (#2)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -17,10 +17,11 @@ pub struct Db {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl Db {
|
impl Db {
|
||||||
/// Connect to the database at `database_url`, opening a connection pool.
|
/// Connect to the database at `database_url`, opening a connection pool with at most
|
||||||
pub async fn connect(database_url: &str) -> Result<Self, sqlx::Error> {
|
/// `max_connections` connections.
|
||||||
|
pub async fn connect(database_url: &str, max_connections: u32) -> Result<Self, sqlx::Error> {
|
||||||
let pool = PgPoolOptions::new()
|
let pool = PgPoolOptions::new()
|
||||||
.max_connections(5)
|
.max_connections(max_connections)
|
||||||
.connect(database_url)
|
.connect(database_url)
|
||||||
.await?;
|
.await?;
|
||||||
|
|
||||||
|
|||||||
@@ -42,4 +42,12 @@ pub struct Config {
|
|||||||
/// Meilisearch index name for catalogue objects.
|
/// Meilisearch index name for catalogue objects.
|
||||||
#[arg(long = "meili-index", env = "MEILI_INDEX", default_value = "objects")]
|
#[arg(long = "meili-index", env = "MEILI_INDEX", default_value = "objects")]
|
||||||
pub meili_index: String,
|
pub meili_index: String,
|
||||||
|
|
||||||
|
/// Maximum size of the PostgreSQL connection pool.
|
||||||
|
#[arg(
|
||||||
|
long = "db-max-connections",
|
||||||
|
env = "DB_MAX_CONNECTIONS",
|
||||||
|
default_value_t = 5
|
||||||
|
)]
|
||||||
|
pub db_max_connections: u32,
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ use tokio::net::TcpListener;
|
|||||||
|
|
||||||
/// Connect dependencies from `config` and serve until shutdown.
|
/// Connect dependencies from `config` and serve until shutdown.
|
||||||
pub async fn run(config: Config) -> anyhow::Result<()> {
|
pub async fn run(config: Config) -> anyhow::Result<()> {
|
||||||
let db = Db::connect(&config.database_url)
|
let db = Db::connect(&config.database_url, config.db_max_connections)
|
||||||
.await
|
.await
|
||||||
.context("connecting to the database")?;
|
.context("connecting to the database")?;
|
||||||
|
|
||||||
@@ -136,7 +136,8 @@ pub async fn create_user(database_url: &str, email: &str, role: Role) -> anyhow:
|
|||||||
auth::hash_password(&password).map_err(|err| anyhow::anyhow!("hashing password: {err}"))?
|
auth::hash_password(&password).map_err(|err| anyhow::anyhow!("hashing password: {err}"))?
|
||||||
};
|
};
|
||||||
|
|
||||||
let db = Db::connect(database_url)
|
// CLI one-shot: a tiny pool is plenty.
|
||||||
|
let db = Db::connect(database_url, 2)
|
||||||
.await
|
.await
|
||||||
.context("connecting to the database")?;
|
.context("connecting to the database")?;
|
||||||
|
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ use tokio::net::TcpListener;
|
|||||||
async fn serves_health_live_over_tcp() {
|
async fn serves_health_live_over_tcp() {
|
||||||
let database_url =
|
let database_url =
|
||||||
std::env::var("DATABASE_URL").expect("DATABASE_URL must be set for this test");
|
std::env::var("DATABASE_URL").expect("DATABASE_URL must be set for this test");
|
||||||
let db = Db::connect(&database_url)
|
let db = Db::connect(&database_url, 2)
|
||||||
.await
|
.await
|
||||||
.expect("connect to database");
|
.expect("connect to database");
|
||||||
let state = AppState {
|
let state = AppState {
|
||||||
|
|||||||
Reference in New Issue
Block a user