baichun_framework_db/
config.rs1use serde::{Deserialize, Serialize};
7use sqlx::mysql::MySqlPoolOptions;
8use std::time::Duration;
9
10#[derive(Debug, Clone, Serialize, Deserialize)]
28pub struct DatabaseConfig {
29 pub url: String,
36
37 #[serde(default = "default_max_connections")]
41 pub max_connections: u32,
42
43 #[serde(default = "default_min_connections")]
47 pub min_connections: u32,
48
49 #[serde(default = "default_connect_timeout")]
53 pub connect_timeout: u64,
54
55 #[serde(default = "default_max_lifetime")]
59 pub max_lifetime: u64,
60
61 #[serde(default = "default_idle_timeout")]
65 pub idle_timeout: u64,
66
67 #[serde(default = "default_acquire_timeout")]
71 pub acquire_timeout: u64,
72}
73
74impl DatabaseConfig {
75 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 pub fn url<S: Into<String>>(mut self, url: S) -> Self {
101 self.url = url.into();
102 self
103 }
104
105 pub fn max_connections(mut self, max: u32) -> Self {
107 self.max_connections = max;
108 self
109 }
110
111 pub fn min_connections(mut self, min: u32) -> Self {
113 self.min_connections = min;
114 self
115 }
116
117 pub fn connect_timeout(mut self, timeout: u64) -> Self {
119 self.connect_timeout = timeout;
120 self
121 }
122
123 pub fn max_lifetime(mut self, lifetime: u64) -> Self {
125 self.max_lifetime = lifetime;
126 self
127 }
128
129 pub fn idle_timeout(mut self, timeout: u64) -> Self {
131 self.idle_timeout = timeout;
132 self
133 }
134
135 pub fn acquire_timeout(mut self, timeout: u64) -> Self {
137 self.acquire_timeout = timeout;
138 self
139 }
140
141 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}