br_pgsql/
pools.rs

1use std::sync::Mutex;
2use crate::config::Config;
3use crate::connect::Connect;
4
5pub(crate) static DB_POOL: std::sync::LazyLock<Mutex<Vec<Connect>>> = std::sync::LazyLock::new(|| Mutex::new(Vec::new()));
6
7#[derive(Clone)]
8pub struct Pools {
9    /// 线程数量
10    pub config: Config,
11    /// 最大线程数量
12    max_pools: usize,
13}
14
15impl Pools {
16    pub fn new(config: Config, size: usize) -> Result<Self, String> {
17        for _ in 0..size {
18            let client = Connect::new(config.clone())?;
19            DB_POOL.lock().unwrap().push(client);
20        }
21        Ok(Self { config, max_pools: size })
22    }
23    pub fn get_connect(&mut self) -> Result<Connect, String> {
24        loop {
25            let mut pool = DB_POOL.lock().unwrap();
26            // 判断是否有可用连接
27            if pool.is_empty() {
28                // 没有,释放锁后休眠(让其他线程可以归还连接)
29            } else if pool.len() <= self.max_pools {
30                return Ok(pool.pop().unwrap());
31            }
32        }
33    }
34}