連線池核心優勢
- 統一配置、管理、監控資料庫連線;參數調優(最大/最小連線、閒置超時、驗證查詢)集中一處。
- 自動回收應用洩漏的連線(未 close、異常中斷),避免資料庫端進程耗盡。
- 應用與資料庫解耦:JNDI 名稱固定,後端遷移/切換/叢集對應用透明。
iPlanet Application Server 6.5 配置步驟
- 將 Oracle JDBC 驅動
classes12.zip 放入 $INSTANCE_DIR/lib。
- 管理主控台 →
JDBC → Connection Pools → New。
名稱:OraclePool,資料源類別:oracle.jdbc.pool.OracleConnectionPoolDataSource。
- 屬性頁設定:
URL=jdbc:oracle:thin:@host:1521:sid
User=app_user
Password=****
MaxConnections=50、MinConnections=5、IdleTimeout=300、ValidationQuery=SELECT 1 FROM DUAL。
- 建立 JDBC Resource:
jdbc/OracleDS 映射至 OraclePool。
- 重啟服務生效。
Sun Java System Application Server 7 配置步驟
classes12.zip 放入 domain_dir/server1/lib。
- 瀏覽器開啟
https://host:4848 管理主控台。
server1 → JDBC → Connection Pools → New。
名稱:MyConnectionPool。
- General 頁:
DataSource Classname:oracle.jdbc.pool.OracleConnectionPoolDataSource。
- Properties 頁:刪除預設屬性,新增:
URL=jdbc:oracle:thin:@dbhost:1521:ORCL
User=app_user
Password=****
dataSourceName=OracleDS(可選)。
其餘參數(Max/Min/Idle/Validation)按環境調整。
- Finish 建立連線池。
- 建立 JDBC Resource:
jdbc/credit2 → 關聯 MyConnectionPool。
- 重啟
server1 生效。
通用 Java 連線池取得連線類
package com.j2ee.db;
import javax.naming.*;
import javax.sql.DataSource;
import java.sql.Connection;
public class DbConnection {
public Connection connectDbByConnectionPool() {
Connection conn = null;
try {
Context ctx = new InitialContext();
DataSource ds = (DataSource) ctx.lookup("jdbc/credit2"); // 對應 JNDI 名稱
conn = ds.getConnection();
} catch (Exception e) {
System.err.println("DB Connection Error: " + e.getMessage());
e.printStackTrace();
}
return conn;
}
}
應用層使用模式
// Servlet / EJB / Spring 服務層
public void doBusiness() {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
conn = new DbConnection().connectDbByConnectionPool();
ps = conn.prepareStatement("SELECT * FROM orders WHERE status = ?");
ps.setString(1, "OPEN");
rs = ps.executeQuery();
while (rs.next()) { /* 處理 */ }
} catch (SQLException e) {
// 記錄錯誤、拋出業務異常
} finally {
// 連線池管理連線生命週期,此處 close 實際是歸還池中
if (rs != null) try { rs.close(); } catch (SQLException ignore) {}
if (ps != null) try { ps.close(); } catch (SQLException ignore) {}
if (conn != null) try { conn.close(); } catch (SQLException ignore) {}
}
}
關鍵參數調優指南
| 參數 | 建議起始值 | 調整依據 |
| MinConnections | CPU 核心數 × 2 | 避免冷啟動延遲,維持基線可用連線 |
| MaxConnections | 資料庫 PROCESSES 參數 × 0.7 / 應用節點數 | 防止單一應用佔滿資料庫進程 |
| IdleTimeout | 300 秒 | 平衡連線重建開銷與資料庫端閒置進程 |
| ValidationQuery | SELECT 1 FROM DUAL | 輕量、無副作用、驗證連線有效性 |
| ValidationInterval | 30 秒 | 避免頻繁驗證影響效能 |
| ConnectionTimeout | 30 秒 | 取得連線最長等待,防止業務線程無限阻塞 |
常見問題排查
- 連線取得超時:檢查 MaxConnections 是否過小、業務邏輯是否未歸還連線(finally 區塊缺失)、資料庫端鎖等待導致連線長期佔用。
- Stale Connection (ORA-03113/03114):啟用 ValidationQuery + ValidationInterval,或配置
ExpiredConnectionCheck(WebSphere)/ test-on-borrow (Tomcat/Druid/HikariCP)。
- 驅動版本不匹配:Oracle 19c+ 建議使用
ojdbc8.jar (JDBC 4.2),舊版 classes12.zip 僅支援 9i/10g,已停止維護。
- 連線池洩漏:啟用連線池偵錯日誌(如
log-abandoned=true),定期分析堆疊追蹤定位洩漏代碼。
現代化替代方案
新專案建議直接在應用框架層配置高效能連線池:
- HikariCP:Spring Boot 2.x 預設、極速、輕量、預設最佳化參數。
- Druid:阿里開源、內建監控、SQL 防火牆、適合國產化環境。
- Tomcat JDBC Pool / DBCP2:傳統 Servlet 容器內建選擇。
應用層連線池可繞過應用伺服器 JNDI 查找開銷,支援更精細的運行期指標暴露,是微服務/雲原生架構的主流選擇。
無論選擇哪種連線池,核心原則不變:配置集中化、參數數據化、洩漏零容忍、演練常態化。
- 上一篇文章: Oracle 與 SQL Server 預存程序調試與錯誤處理實戰對比
- 下一篇文章: J2EE 應用開發中連接 Oracle 數據庫的實戰指南
Copyright ©
程式碼之家 All Rights Reserved