建立資料庫連線是高成本操作:涉及網路握手、驗證、資源分配。若每請求建立、關閉連線,系統吞吐量會急劇下降。連線池採用「資源池」設計模式,預先建立連線物件放入池中,使用時借出,歸還時放回,實現連線複用,大幅降低開銷。
minConn 條連線置於閒置池。maxConn,新建連線;已達上限則等待 timeout。minConn,釋放超時/失效連線。多執行緒環境下,連線池的借還操作必須執行緒安全。Java 提供 synchronized 關鍵字或 ReentrantLock 實現同步,例如:
public synchronized Connection getConnection(long timeout) { ... }
採用單例模式的連線池管理器(DBConnectionPoolManager),讀取屬性檔(URL、帳號、密碼),為每組資料庫建立獨立連線池實例(DBConnectionPool),以名稱映射管理。同一資料庫不同帳號同理可建多池。
事務要求「全做或全不做」。策略:一個事務獨佔一條連線,關閉自動提交(conn.setAutoCommit(false)),顯式 commit()/rollback()。避免連線在事務間共用導致髒讀或提交混亂。
ArrayList 按建立時間排序存放。maxConn 時阻塞等待,超時返回 null。| 參數 | 含義 | 調優建議 |
|---|---|---|
| minConn | 啟動建立連線數 | 開發期設小,生產期設大(預熱) |
| maxConn | 最大連線上限 | 壓測找最佳點,防資料庫過載 |
| timeout | 借用等待上限 | 業務容忍度決定,通常 3-5 秒 |
動態策略:定時檢測補齊 minConn;靜態策略:借用發現不足時才檢查補充。
DBConnectionPool實作 TimerListener,核心屬性與方法:
public class DBConnectionPool implements TimerListener {
private int checkedOut; // 已借出數
private ArrayList freeConnections; // 閒置池
private int minConn, maxConn;
private String name, url, user, password;
private Timer timer; // 定時維護
public synchronized Connection getConnection(long timeout) { ... }
public synchronized void freeConnection(Connection con) { ... }
public synchronized void release() { ... } // 關閉所有連線
private Connection newConnection() { ... } // 建立新連線
public synchronized void TimerEvent() { ... } // 定時任務:檢測/補齊
}
DBConnectionManager(單例)public class DBConnectionManager {
static private DBConnectionManager instance;
private ArrayList drivers; // JDBC 驅動
private HashMap pools; // name -> DBConnectionPool
static synchronized public DBConnectionManager getInstance() { ... }
private DBConnectionManager() { init(); }
private void loadDrivers(Properties props) { ... }
private void createPools(Properties props) { ... }
public Connection getConnection(String name) { ... }
public void freeConnection(String name, Connection con) { ... }
public synchronized void release() { ... }
}
在 Servlet 生命週期中整合:
public class MyServlet extends HttpServlet {
private DBConnectionManager connMgr;
public void init() throws ServletException {
connMgr = DBConnectionManager.getInstance(); // 初始化池
}
public void doGet(HttpServletRequest req, HttpServletResponse res) {
Connection conn = connMgr.getConnection("mainPool");
try {
// 業務邏輯
} finally {
connMgr.freeConnection("mainPool", conn); // 歸還
}
}
public void destroy() {
connMgr.release(); // 關閉所有資源
super.destroy();
}
}
連線池是企業級應用效能基石。本文模型提供基礎骨架,實際生產可擴展:
核心思想:以空間換時間,以同步換安全,以配置換靈活。