Skip to main content

mycommon_utils/database/config/
mod.rs

1use 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
29/// 初始化 Redis 连接池(同步和异步)
30pub 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    // 初始化数据库连接
41    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    // 创建数据库连接池
50    let db_connect: DatabaseConnection = Database::connect(opt).await.expect("Failed to connect to the database");
51    // 设置数据库全部变量
52    DATABASE.set(Arc::new(db_connect)).expect("设置数据库连接全局变量失败");
53}