資料庫應用是中大型系統的核心支撐,但若缺乏妥善的資源管理——未及時回收 ResultSet、Statement、Connection 等資源,系統穩定性將面臨嚴重威脅。這類問題往往在系統上線後、流量與用戶增長時才逐漸暴露,極難在開發階段發現。
JDBC 提供完備的資料庫操作介面,但僅規範最直接的操作方法,對物理連線的管理與快取留待應用伺服器實作。標準 JDBC 取得連線流程如下:
DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
Connection dbConn = DriverManager.getConnection(
"jdbc:oracle:thin:@127.0.0.1:1521:oracle", "username", "password");
Statement st = dbConn.createStatement();
ResultSet rs = st.executeQuery("select * from demo_table");
// ... 資料操作
rs.close(); st.close(); dbConn.close();
雖然資源關閉對業務邏輯無直接影響,但一旦在複雜的 if-else、try-catch 流程中遺漏,將導致資源洩漏,如同 C 語言的記憶體洩漏,最終拖垮資料庫甚至整個系統。依賴應用層自行管理顯然不安全、不可靠。

JDBC 規範為第三方應用伺服器定義了連線快取標準介面,引入「連線池」概念——以緩衝池機制管理資料庫資源。JDBC 三大核心資源及其關係:

這是典型的「爺-父-子」階層:管理 Connection 即管理核心資源。判斷 Connection 是否超時,需檢查其所有 Statement;關閉 Connection 前,必須先關閉所有子 Statement 與 ResultSet。因此連線池不僅管理 Connection,更必須涵蓋 Statement 與 ResultSet 的全生命週期。
資料庫資源有限,連線池首要職責是限制每個應用可佔用的最大資源量,設定連線池大小,防止單一應用耗盡資源導致其他應用無法運作。
許多資料庫中,Connection 並非最小資源單元,Statement 才是關鍵。以 Oracle 為例:
傳統寫法:10 次查詢 = 10 個物理連線 = 極大浪費。
連線池優化:數十上百個 Statement 共用同一物理連線,縮短會話週期,發揮資料庫原生優勢。
應用可獲得的總 Statement 並發數 = (並發物理連線數) × (每連線可支援 Statement 數)
例:200 物理連線 × 250 Statement = 50,000 併發 Statement,遠超絕多數系統需求。資源耗盡多半源於程式管理不當,而非負載過高。
資源申請、釋放、回收、共享、同步控制極為精密複雜。連線池將這些封裝內部,對外提供簡單、甚至不改變原有呼叫風格的 API,讓開發者專注業務邏輯。
Statement 複用依賴 JDBC Driver 支援「邏輯連線」功能。部分資料庫(如 SQL Server 舊版驅動)不支援此特性,需等待驅動程式更新。