br_pgsql/
pools.rs

1use std::collections::VecDeque;
2use std::sync::Mutex;
3use crate::config::Config;
4use crate::connect::Connect;
5
6pub(crate) static DB_POOL: std::sync::LazyLock<Mutex<VecDeque<Connect>>> = std::sync::LazyLock::new(|| Mutex::new(VecDeque::new()));
7
8#[derive(Clone)]
9pub struct Pools {
10    /// 线程数量
11    pub config: Config,
12    /// 最大线程数量
13    max_pools: usize,
14}
15
16impl Pools {
17    // 新建pools
18    pub fn new(config: Config, size: usize) -> Result<Self, String> {
19        for _ in 0..size {
20            let client = Connect::new(config.clone())?;
21            DB_POOL.lock().unwrap().push_back(client);
22        }
23        Ok(Self { config, max_pools: size })
24    }
25    
26    // 获取连接
27    pub fn get_connect(&mut self) -> Result<Connect, String> {
28        loop {
29            let mut pool = DB_POOL.lock().unwrap();
30            // 判断是否有可用连接
31            if pool.is_empty() {
32                // 没有,释放锁后休眠(让其他线程可以归还连接)
33            } else if pool.len() <= self.max_pools {
34                return Ok(pool.pop_front().unwrap());
35            }
36        }
37        
38        // let mut pool = DB_POOL.lock().unwrap();
39        // 
40        // loop {
41        //     if pool.is_empty() {
42        //         let conn = Connect::new(self.config.clone())?;
43        //         return Ok(conn)
44        //     }
45        //     if pool.len() <= self.max_pools {
46        //         if let Some(conn) = pool.pop_front() {
47        //             return if conn.is_valid() {
48        //                 Ok(conn)
49        //             } else {
50        //                 // 已关闭连接则丢弃并重新建立
51        //                 let conn = Connect::new(self.config.clone())?;
52        //                 Ok(conn)
53        //             }
54        //         }
55        //     }
56        // }
57    }
58
59    // 手动归还连接到pools方法
60    pub fn _release_conn(&self, conn: Connect) {
61        if conn.is_valid() {
62            let mut pool = DB_POOL.lock().unwrap();
63            pool.push_back(conn); // 放回池子
64        } else {
65            // 自动 drop / 清理逻辑生效
66        }
67    }
68
69    /// 获取当前连接池中的连接数量
70    pub fn current_pool_size(&self) -> usize {
71        let pool = DB_POOL.lock().unwrap();
72        pool.len()
73    }
74
75    // 清除无效连接的方法
76    pub fn _cleanup_idle_connections(&self) {
77        let mut pool = DB_POOL.lock().unwrap();
78        println!("当前连接池中的连接数量(清理前): {}", pool.len());
79
80        pool.retain(|conn| {
81            let is_ok = conn.stream.peer_addr().is_ok();
82            if !is_ok {
83                println!("检测到无效连接,已移除");
84            }
85            is_ok
86        });
87
88        println!("当前连接池中的连接数量(清理后): {}", pool.len());
89    }
90}