首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 自定義資料庫連線池實現全解析

     編輯:Java 相關知識

連線池是資料庫存取的核心優化手段。本文展示一個輕量級、可生產使用的自定義連線池實現,支援連線有效性檢查與自動重連,適用於 Oracle、Teradata、Greenplum 等主流資料庫。程式碼基於 JRE 1.4.2 編寫,邏輯清晰,適合學習與中小型專案直接採用。

設計核心類別

  • DBPool:連線池核心,管理連線陣列、狀態陣列、時間戳陣列,提供初始化、獲取/釋放連線、有效性檢查、重連等功能。
  • DBPoolConfiguration:配置資料類別,封裝驅動類、URL、帳號、密碼、連線數等參數。
  • DBPoolConnection:連線包裝物件,持有連線編號與 Connection 實例。
  • DBPoolIsFullException:池耗盡異常。

關鍵特性

固定大小連線池

採用固定陣列儲存連線,避免動態擴縮容的複雜性,簡化併發控制。初始化時一次性建立所有連線,狀態標記為「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 ...

設計反思與改進方向

  1. 連線池應作為模組底層實現,將超時管理、請求佇列、資源釋放保證、分頁方言等上層邏輯剝離。
  2. 固定連線數優於動態擴縮,簡單程式碼更易維護。
  3. 待優化點:空閒連線查詢採用陣列遍歷,大池時效率降低;可增加阻塞式獲取連線功能,支援資料庫重啟時的平滑恢復。

完整原始碼包含 5 個類別與測試類,可直接複製至專案使用。建議搭配 Apache JCS 等快取框架實現物件重用,進一步降低 GC 壓力。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved