連接池核心數據結構
typedef struct {
DBConn *conns; // 連接數組
int maxSize; // 最大連接數
int curSize; // 當前連接數
int busyCount; // 忙碌連接數
pthread_mutex_t lock; // 互斥鎖
pthread_cond_t cond; // 條件變量(等待可用)
} ConnPool;
四大核心操作
- 初始化:預創建
minSize 連接,置入池,busyCount=0。
- 借用連接:
加鎖 → 有空閒取出、標記忙 → 無空閒且 創建新 → 仍無則等待條件變量 → 取出返回。
- 歸還連接:加鎖 → 標記閒置、busyCount-- → 信號喚醒等待者 → 解鎖。
- 空閒檢測與動態調整:定時線程掃描,空閒超時關閉釋放(保留 minSize),負載高時預創建擴容。
關鍵併發控制
- 互斥鎖保護池結構體所有字段。
- 條件變量實現「等待可用連接」無忙等。
- 歸還時
pthread_cond_signal 喚醒一個等待者。
錯誤處理與健壯性
- 借用前 ping 檢測連接活性,失效則重建。
- 歸還時檢測連接狀態,壞連接銷毀不放回池。
- 程序退出遍歷池逐個關閉連接、銷毀鎖條件變量。