池化技術在 Java 中無處不在。核心思想:預先創建昂貴資源(如數據庫連接、線程)實例池,使用時借用,歸還時放回,避免頻繁創建銷燬開銷。數據庫連接建立涉及 TCP 握手、認證、資源分配,開銷極大,且數據庫最大連接數有限,連接池成為標配。業界成熟方案有 HikariCP、Druid、C3P0、DBCP 等,本文從零手寫一個教學級連接池,深入理解核心原理。
採用 Builder 模式構建,包含必需參數(driver、url、user、password)與可選參數(minConnection、maxConnection、minIdle、maxWait)。
public class ConnectionParam {
private final String driver, url, user, password;
private final int minConnection, maxConnection, minIdle;
private final long maxWait;
// Builder 內部類省略...
}
實現 javax.sql.DataSource 接口,內部維護兩個容器:
ArrayBlockingQueue<Connection> idleQueue:空閒連接隊列(線程安全)。Vector<Connection> busyVector:活躍連接集合(同步)。關鍵機制:靜態代理包裝 Connection。getConnection() 返回代理對象,攔截 close() 調用,實際執行「歸還隊列」而非真正關閉物理連接。
public Connection getConnection() throws SQLException {
Connection conn = idleQueue.poll(maxWait, TimeUnit.MILLISECONDS);
if (conn == null) { ensureCapacity(); return null; }
busyVector.add(conn);
return (Connection) Proxy.newProxyInstance(
getClass().getClassLoader(),
new Class[]{Connection.class},
(proxy, method, args) -> {
if (!"close".equals(method.getName()))
return method.invoke(conn, args);
idleQueue.offer(conn);
busyVector.remove(conn);
return null;
}
);
}
擴容策略:當空閒不足時,按 minIdle 批量創建新連接,上限不超 maxConnection。
單例管理多個命名連接池,基於 ConcurrentHashMap 線程安全。提供註冊、獲取、註銷、狀態查詢接口。
public static Connection getConnection(String poolName) throws SQLException {
ConnectionPool pool = poolMap.get(poolName);
return pool.getConnection();
}
public static void registerConnectionPool(String name, ConnectionParam param) {
poolMap.put(name, new ConnectionPool(param));
}
ParamConfiguration:默認常量定義Builder<T>:構建器接口ConnectionParam:參數實體ConnectionPool:連接池實現ConnectionPoolFactory:工廠管理類ConnectionPoolFactoryTest:JUnit 測試用例ConnectionParam param = new ConnectionParam.ConnectionParamBuilder(
"com.mysql.jdbc.Driver",
"jdbc:mysql://localhost:3306/test",
"root", "root"
).maxConnection(20).minIdle(5).build();
ConnectionPoolFactory.registerConnectionPool("mainDB", param);
try (Connection conn = ConnectionPoolFactory.getConnection("mainDB")) {
// 業務操作
conn.createStatement().execute("SELECT 1");
} // 自動歸還連接池
JUnit 測試模擬併發獲取 12 個連接,驗證空閒/活躍/總數變化,確認連接正確歸還與復用。測試輸出示例:
idle: 5
busy: 12
size: 17
// 歸還後
idle: 17
busy: 0
size: 17
教學版連接池為突出原理,省略了:連接驗證、洩漏檢測、準備語句緩存、指標監控、動態配置更新等生產級特性。實際項目強烈推薦 HikariCP(性能最優)或 Druid(監控最強),兩者均開源、活躍維護、廣泛驗證。