mycommon_utils/database/config/
mod.rs1use std::sync::{Arc, OnceLock};
2use std::time::Duration;
3use sea_orm::{ConnectOptions, Database, DatabaseConnection};
4use serde::{Deserialize, Serialize};
5use crate::log::log;
6use crate::log::log::LogConfig;
7
8pub static DATABASE: OnceLock<Arc<DatabaseConnection>> = OnceLock::new();
9
10pub static REDIS_ASYNC_POOL: OnceLock<Arc<deadpool_redis::Pool>> = OnceLock::new();
11
12#[derive(Deserialize, Serialize, Debug)]
13pub struct DatasourceConfig {
14 pub url: String,
15 pub max_connections:u32,
16 pub min_connections:u32,
17 pub connect_timeout: u64,
18 pub idle_timeout: u64,
19 pub max_lifetime: u64,
20}
21
22#[derive(Deserialize, Serialize, Debug)]
23pub struct RedisConfig {
24 pub url: String,
25 pub max_size: u32,
26 pub min_idle: u32,
27}
28
29pub fn redis_conn(config: &RedisConfig) {
31 let cfg = deadpool_redis::Config::from_url(config.url.clone());
32 let async_pool = cfg.builder().expect("创建 Redis 异步连接池构建器失败")
33 .max_size(config.max_size as usize)
34 .build()
35 .expect("创建异步 Redis 连接池失败");
36 REDIS_ASYNC_POOL.get_or_init(move || Arc::new(async_pool));
37}
38
39pub async fn db_conn(db: &DatasourceConfig, log: &LogConfig) {
40 let mut opt = ConnectOptions::new(db.url.clone());
42 opt.max_connections(db.max_connections)
43 .min_connections(db.min_connections)
44 .connect_timeout(Duration::from_secs(db.connect_timeout))
45 .idle_timeout(Duration::from_secs(db.idle_timeout))
46 .max_lifetime(Duration::from_secs(db.max_lifetime))
47 .sqlx_logging(log.debug)
48 .sqlx_logging_level(log::log_orm_level(log.level.as_str()));
49 let db_connect: DatabaseConnection = Database::connect(opt).await.expect("Failed to connect to the database");
51 DATABASE.set(Arc::new(db_connect)).expect("设置数据库连接全局变量失败");
53}