Skip to main content

mycommon_utils/database/config/
mod.rs

1use std::sync::{Arc, OnceLock};
2use std::time::Duration;
3use r2d2::Pool;
4use redis::Client;
5use sea_orm::{ConnectOptions, Database, DatabaseConnection};
6use serde::{Deserialize, Serialize};
7use crate::log::log;
8use crate::log::log::LogConfig;
9
10// 数据库连接池全局变量
11pub static DATABASE: OnceLock<Arc<DatabaseConnection>> = OnceLock::new();
12
13pub static REDIS_POOL : OnceLock<Pool<Client>> = OnceLock::new();
14
15#[derive(Deserialize, Serialize, Debug)]
16pub struct DatasourceConfig {
17    pub url: String,
18    //数据库线程池最大连接数(默认10)
19    pub max_connections:u32,
20    //数据库线程池最小连接数 (默认1)
21    pub min_connections:u32,
22    //数据库连接超时时间,单位秒 (默认10秒)
23    pub  connect_timeout: u64,
24    //数据库连接最大空闲时间,单位秒 (默认1小时)
25    pub idle_timeout: u64,
26    //数据库连接最大存活时间,单位秒 (默认8小时)
27    pub max_lifetime: u64,
28}
29
30#[derive(Deserialize, Serialize, Debug)]
31pub struct RedisConfig {
32    pub url: String,
33    pub max_size: u32,
34    pub min_idle: u32,
35}
36
37
38/// 初始化redis连接
39pub fn redis_conn(config: &RedisConfig) {
40    let client = Client::open(config.url.as_str()).expect("连接REDIS服务失败");
41    let pool= Pool::builder()
42        .max_size(config.max_size)
43        .min_idle(match config.min_idle
44        { 0 => None,
45            _ => Some(config.min_idle)
46        }).build(client).expect("创建redis连接池失败");
47    REDIS_POOL.get_or_init( move || pool);
48}
49
50pub async fn db_conn(db: &DatasourceConfig, log: &LogConfig) {
51    // 初始化数据库连接
52    let mut opt = ConnectOptions::new(db.url.clone());
53    opt.max_connections(db.max_connections)
54        .min_connections(db.min_connections)
55        .connect_timeout(Duration::from_secs(db.connect_timeout))
56        .idle_timeout(Duration::from_secs(db.idle_timeout))
57        .max_lifetime(Duration::from_secs(db.max_lifetime))
58        .sqlx_logging(log.debug)
59        .sqlx_logging_level(log::log_orm_level(log.level.as_str()));
60    // 创建数据库连接池
61    let db_connect: DatabaseConnection = Database::connect(opt).await.expect("Failed to connect to the database");
62    // 设置数据库全部变量
63    DATABASE.set(Arc::new(db_connect)).expect("设置数据库连接全局变量失败");
64}