baichun_framework_db/
config.rs

1//! 数据库配置模块
2//!
3//! 本模块提供了数据库连接池的配置选项,支持自定义连接数、超时时间等参数。
4//! 所有配置参数都有合理的默认值,可以根据实际需求进行调整。
5
6use serde::{Deserialize, Serialize};
7use sqlx::mysql::MySqlPoolOptions;
8use std::time::Duration;
9
10/// 数据库配置结构体
11///
12/// 用于配置数据库连接池的各项参数,包括连接 URL、连接数限制、超时设置等。
13/// 所有字段都提供了默认值,可以只设置必要的参数。
14///
15/// # 示例
16///
17/// ```rust
18/// use baichun_framework_db::DatabaseConfig;
19///
20/// let config = DatabaseConfig {
21///     url: "mysql://user:pass@localhost/db_name".to_string(),
22///     max_connections: 20,
23///     min_connections: 5,
24///     ..Default::default()
25/// };
26/// ```
27#[derive(Debug, Clone, Serialize, Deserialize)]
28pub struct DatabaseConfig {
29    /// 数据库连接 URL
30    ///
31    /// 支持以下格式:
32    /// - MySQL: `mysql://user:pass@host:port/dbname`
33    /// - PostgreSQL: `postgresql://user:pass@host:port/dbname`
34    /// - SQLite: `sqlite:///path/to/db.sqlite`
35    pub url: String,
36
37    /// 连接池中的最大连接数
38    ///
39    /// 默认值为 CPU 核心数的 2 倍
40    #[serde(default = "default_max_connections")]
41    pub max_connections: u32,
42
43    /// 连接池中的最小连接数
44    ///
45    /// 默认值为 CPU 核心数,最小为 1
46    #[serde(default = "default_min_connections")]
47    pub min_connections: u32,
48
49    /// 连接超时时间(秒)
50    ///
51    /// 建立新连接时的超时时间,默认为 10 秒
52    #[serde(default = "default_connect_timeout")]
53    pub connect_timeout: u64,
54
55    /// 连接最大生命周期(秒)
56    ///
57    /// 一个连接在连接池中的最长存活时间,默认为 1 小时
58    #[serde(default = "default_max_lifetime")]
59    pub max_lifetime: u64,
60
61    /// 空闲连接超时时间(秒)
62    ///
63    /// 空闲连接在被关闭前的最长等待时间,默认为 10 分钟
64    #[serde(default = "default_idle_timeout")]
65    pub idle_timeout: u64,
66
67    /// 获取连接超时时间(秒)
68    ///
69    /// 从连接池获取连接的最长等待时间,默认为 30 秒
70    #[serde(default = "default_acquire_timeout")]
71    pub acquire_timeout: u64,
72}
73
74impl DatabaseConfig {
75    /// 创建一个新的数据库配置实例
76    ///
77    /// # 示例
78    ///
79    /// ```rust
80    /// use baichun_framework_db::DatabaseConfig;
81    ///
82    /// let config = DatabaseConfig::new()
83    ///     .url("mysql://user:pass@localhost/db_name")
84    ///     .max_connections(20)
85    ///     .min_connections(5);
86    /// ```
87    pub fn new() -> Self {
88        Self {
89            url: String::new(),
90            max_connections: default_max_connections(),
91            min_connections: default_min_connections(),
92            connect_timeout: default_connect_timeout(),
93            max_lifetime: default_max_lifetime(),
94            idle_timeout: default_idle_timeout(),
95            acquire_timeout: default_acquire_timeout(),
96        }
97    }
98
99    /// 设置数据库连接 URL
100    pub fn url<S: Into<String>>(mut self, url: S) -> Self {
101        self.url = url.into();
102        self
103    }
104
105    /// 设置最大连接数
106    pub fn max_connections(mut self, max: u32) -> Self {
107        self.max_connections = max;
108        self
109    }
110
111    /// 设置最小连接数
112    pub fn min_connections(mut self, min: u32) -> Self {
113        self.min_connections = min;
114        self
115    }
116
117    /// 设置连接超时时间(秒)
118    pub fn connect_timeout(mut self, timeout: u64) -> Self {
119        self.connect_timeout = timeout;
120        self
121    }
122
123    /// 设置连接最大生命周期(秒)
124    pub fn max_lifetime(mut self, lifetime: u64) -> Self {
125        self.max_lifetime = lifetime;
126        self
127    }
128
129    /// 设置空闲连接超时时间(秒)
130    pub fn idle_timeout(mut self, timeout: u64) -> Self {
131        self.idle_timeout = timeout;
132        self
133    }
134
135    /// 设置获取连接超时时间(秒)
136    pub fn acquire_timeout(mut self, timeout: u64) -> Self {
137        self.acquire_timeout = timeout;
138        self
139    }
140
141    /// 将配置转换为 SQLx 连接池选项
142    pub fn into_pool_options(&self) -> MySqlPoolOptions {
143        MySqlPoolOptions::new()
144            .max_connections(self.max_connections)
145            .min_connections(self.min_connections)
146            .acquire_timeout(Duration::from_secs(self.acquire_timeout))
147            .idle_timeout(Duration::from_secs(self.idle_timeout))
148            .max_lifetime(Some(Duration::from_secs(self.max_lifetime)))
149    }
150}
151
152impl Default for DatabaseConfig {
153    fn default() -> Self {
154        Self::new()
155    }
156}
157
158fn default_max_connections() -> u32 {
159    (num_cpus::get() * 2) as u32
160}
161
162fn default_min_connections() -> u32 {
163    (num_cpus::get() as u32).max(1)
164}
165
166fn default_connect_timeout() -> u64 {
167    10
168}
169
170fn default_max_lifetime() -> u64 {
171    3600
172}
173
174fn default_idle_timeout() -> u64 {
175    600
176}
177
178fn default_acquire_timeout() -> u64 {
179    30
180}