mycommon_utils/database/config/
mod.rs1use 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
10pub 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 pub max_connections:u32,
20 pub min_connections:u32,
22 pub connect_timeout: u64,
24 pub idle_timeout: u64,
26 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
38pub 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 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 let db_connect: DatabaseConnection = Database::connect(opt).await.expect("Failed to connect to the database");
62 DATABASE.set(Arc::new(db_connect)).expect("设置数据库连接全局变量失败");
64}