數據庫連接池是高性能 Java 應用的基石。本文從實戰角度總結連接池核心設計要點,涵蓋代理模式、資源回收、單例模式、工廠模式等關鍵技術,幫助開發者構建健壯、易用的連接池組件。
Connection、Statement、ResultSet)。close() 直接調用。自定義 _Connection 實現 java.sql.Connection 接口,內部持有真實連接,攔截關鍵方法:
createStatement():記錄創建的 Statement 引用,便於後續統一關閉。prepareStatement():同理記錄 PreparedStatement。close():不真正關閉物理連接,而是標記為「空閒」、關閉關聯資源、歸還池中。// 核心邏輯片段
if (CLOSE.equals(method.getName())) {
setIsFree(true); // 標記可復用
if (statRef != null) statRef.close();
if (preStatRef != null) preStatRef.close();
return null; // 阻止真實 close()
}
ConnectionFactory 為單例,持有 FreeConnectionPool(空閒連接集合)與 BusyConnectionPool(活躍連接集合)。MinConnectionCount),啟動管理線程(FactoryManageThread)定期檢查連接有效性、擴縮容。getFreeConnection() 獲取連接,內部從空閒池取出或新建(不超過最大連接數)。public static _Connection getConnection(ConnectionFactory factory, ConnectionParam param) {
if (factory.isCreate()) { // 驗證工廠合法性
return new _Connection(param);
}
return null;
}
ConnectionParam:封裝 driver、url、user、password。FactoryParam:封裝 maxConn、minConn、manageType(管理策略)等池屬性。ConnectionParam param = new ConnectionParam(driver, url, user, passWord);
ConnectionFactory cf = new ConnectionFactory(param, new FactoryParam());
Connection conn1 = cf.getFreeConnection();
Statement stmt = conn1.createStatement();
ResultSet rs = stmt.executeQuery("select * from requests");
// ... 業務邏輯
stmt.close(); // 實際觸發代理 close(),歸還連接
conn1.close(); // 同上
validationQuery(如 SELECT 1)與 testOnBorrow,防止拿到斷開的連接。連接池本質是「空間換時間」的資源複用模式。核心難點在於 透明化代理、線程安全的池調度、資源確定性回收。理解這些原理,有助於排查連接洩漏、超時、死鎖等疑難雜症,也能在選型與調優時做出科學決策。