use std::time::Duration;
use sqlx::{
mysql::{MySqlConnectOptions, MySqlPoolOptions, MySqlSslMode},
ConnectOptions, Error, MySqlPool,
};
use crate::config::TiDBConfig;
#[tracing::instrument(name = "tidb_svc", err, skip(config))]
pub async fn build_pool_from_config(config: TiDBConfig) -> Result<MySqlPool, Error> {
info!("Initializing connection pool to TiDB...");
info!("Database host: {}", config.get_host());
let port = config.port.unwrap_or(4000_u16);
let mut conn_options = MySqlConnectOptions::new()
.host(config.host.as_str())
.port(port)
.database(config.database_name.as_str())
.username(config.username.as_str())
.password(config.password.as_str())
.statement_cache_capacity(1000);
if let Some(file_name) = config.ssl_ca {
conn_options = conn_options
.ssl_mode(MySqlSslMode::VerifyCa)
.ssl_ca(file_name);
}
let conn_options = conn_options
.log_statements(tracing::log::LevelFilter::Debug) .log_slow_statements(tracing::log::LevelFilter::Off, Duration::default());
let pool_options: MySqlPoolOptions = MySqlPoolOptions::new()
.max_connections(config.pool_options.max_connections) .min_connections(config.pool_options.min_connections) .idle_timeout(Duration::from_secs(config.pool_options.idle_timeout)) .max_lifetime(Duration::from_secs(config.pool_options.max_lifetime)) .acquire_timeout(Duration::from_secs(config.pool_options.acquire_timeout));
log_pool_settings(&pool_options);
let pool_db: MySqlPool = if config.pool_options.is_lazy {
Ok(pool_options.connect_lazy_with(conn_options.clone()))
} else {
pool_options.connect_with(conn_options.clone()).await
}
.map_err(|err| {
error!(
"Failed to connect to TiDB server at {}:{}",
config.host, port
);
err
})?;
info!("TiDB connection pool initialized successfully. Lazy mode: {}", config.pool_options.is_lazy);
Ok(pool_db)
}
fn log_pool_settings(pool_options: &MySqlPoolOptions) {
info!("Connection pool settings:");
info!(" Max connections: {}", pool_options.get_max_connections());
info!(" Min connections: {}", pool_options.get_min_connections());
info!(" Acquire timeout: {:?}", pool_options.get_acquire_timeout());
info!(" Idle timeout: {:?}", pool_options.get_idle_timeout());
info!(" Max lifetime: {:?}", pool_options.get_max_lifetime());
}