完整連線池管理類
import java.sql.Connection;
import oracle.jdbc.pool.OracleConnectionCacheImpl;
public class DBPool {
/** 連線池單例 */
private static OracleConnectionCacheImpl pool = null;
/** 初始化連線池 */
public static void init() {
try {
// 連線參數
String user = "user";
String passWord = "pwd";
String host = "127.0.0.1";
String port = "1521";
String sid = "Oracle92";
int max = 20; // 最大連線數
int min = 5; // 最小連線數
// 組裝 JDBC Thin URL
String url = "jdbc:oracle:thin:@" + host + ":" + port + ":" + sid;
// 實例化並設定
pool = new OracleConnectionCacheImpl();
pool.setURL(url);
pool.setPassword(passWord);
pool.setUser(user);
pool.setMaxLimit(max);
pool.setMinLimit(min);
// 快取策略:動態擴展,用完超過上限則關閉
pool.setCacheScheme(OracleConnectionCacheImpl.DYNAMIC_SCHEME);
/* 其他策略:
FIXED_RETURN_NULL_SCHEME - 達上限直接回傳 null
FIXED_WAIT_SCHEME - 達上限持續等待
*/
/* 若已有 OracleConnectionPoolDataSource (ocpds),可直接注入:
pool.setConnectionPoolDataSource(ocpds);
此時上方 URL/帳密/限制設定可省略。
*/
} catch (Exception ex) {
ex.printStackTrace(); // 建議記錄日誌
}
}
/** 關閉連線池 (應用關閉時呼叫) */
public static void destroy() {
if (pool != null) {
try {
pool.close();
pool = null;
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
/** 取得連線 */
public static Connection getConnection() {
try {
return pool.getConnection();
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/** 監控除錯用 */
public static void tuning() {
System.out.println("Active Conns: " + pool.getActiveSize());
System.out.println("Cached Conns: " + pool.getCacheSize());
}
}
關鍵點說明
| 項目 | 說明 |
| Driver | 使用 oracle.jdbc.pool.OracleConnectionCacheImpl,需 ojdbc*.jar 支援 |
| URL 格式 | jdbc:oracle:thin:@host:port:sid (Thin 驅動,無需 Oracle Client) |
| CacheScheme | DYNAMIC_SCHEME 最彈性,達 MaxLimit 後新連線用完即關,不佔用池資源 |
| Thread Safety | 靜態單例模式,getConnection() 為同步安全 |
| 生命週期 | 應用啟動呼叫 init(),關閉呼叫 destroy() |
進階建議
- 生產環境建議改用 HikariCP、Druid 或 Tomcat JDBC Pool,功能更豐富、效能更佳、社群支援更完善。
- 若堅持使用 Oracle 內建池,請注意
OracleConnectionCacheImpl 在 12c 後標記為 @Deprecated,未來版本可能移除。
- 監控指標:
getActiveSize() (使用中)、getCacheSize() (閒置池中),定期記錄以調整 Min/Max 參數。