連線池是資料庫存取的核心優化手段。本文展示一個輕量級、可生產使用的自定義連線池實現,支援連線有效性檢查與自動重連,適用於 Oracle、Teradata、Greenplum 等主流資料庫。程式碼基於 JRE 1.4.2 編寫,邏輯清晰,適合學習與中小型專案直接採用。
採用固定陣列儲存連線,避免動態擴縮容的複雜性,簡化併發控制。初始化時一次性建立所有連線,狀態標記為「Y」(可用)。
boolean checkConn(DBPoolConnection poolConnection) {
Statement stmt = null;
try {
String sql = "select * from dual";
stmt = this.connections[poolConnection.connNbr].createStatement();
stmt.executeQuery(sql);
stmt.close();
return true;
} catch (Exception e) {
String msg = e.getMessage();
// 僅特定錯誤不需重連
if (msg != null && (msg.indexOf("ORA-00942") >= 0
|| msg.indexOf("does not exist") >= 0
|| msg.indexOf("Syntax error") >= 0)) {
return true;
}
return false; // 需重連
}
}
resetConn() 在檢測到連線失效時,重新載入驅動並建立新連線,更新狀態為可用。
測試程式演示完整生命週期:初始化池 → 獲取連線 → 執行查詢 → 釋放連線 → 銷毀池。輸出結果顯示連線狀態正確流轉:
initPool is ready... after init Pool Y-[null] Y-[null] after getPoolConn N-[Wed Mar 20 14:46:31 GMT 2013] Y-[null] FIELD_ID|FIELD_CONTENT |DAY 001 |this is first record |20130320 ... after freePoolConn Y-[Wed Mar 20 14:46:31 GMT 2013] Y-[null] freePool is over ...
完整原始碼包含 5 個類別與測試類,可直接複製至專案使用。建議搭配 Apache JCS 等快取框架實現物件重用,進一步降低 GC 壓力。