c3p0連線池需要關閉連線麼
阿新 • • 發佈:2019-01-27
使用 c3p0 的話,也是 java.sql.Connection,只要是 JDBC 都是這個介面的物件!
使用完後必須 con.close() 掉,使用連線池的話,執行 con.close 並不會關閉與資料庫的 TCP 連線,而是將連線還回到池中去,如果不 close 掉的話,這個連線將會一直被佔用,直接連線池中的連線耗盡為止。
至於是如何做到 con.close 並不是真正意義上的關閉連線?而是直接將連線還回到池中去?
一般有兩種方式:
一:使用裝飾器模式,在裝飾器構造中傳入一個真正的 Connection,這個裝飾器實現 Connection,使用構造 傳入 Connection 委託重寫所有方法,並改寫 close 方法:
Java code ?
然後經過連線池控制的 Connection 物件都使用該裝飾器進行包裝
二:動態代理:
使用動態代理重新實現 close 方法,每個獲得 Connection 是一個代理後的物件。
一個完善的連線池,其架構設計非常複雜,Connection#close 問題就是連線池諸多設計難點當中的一個。
使用完後必須 con.close() 掉,使用連線池的話,執行 con.close 並不會關閉與資料庫的 TCP 連線,而是將連線還回到池中去,如果不 close 掉的話,這個連線將會一直被佔用,直接連線池中的連線耗盡為止。
至於是如何做到 con.close 並不是真正意義上的關閉連線?而是直接將連線還回到池中去?
一般有兩種方式:
一:使用裝飾器模式,在裝飾器構造中傳入一個真正的 Connection,這個裝飾器實現 Connection,使用構造 傳入 Connection 委託重寫所有方法,並改寫 close 方法:
Java code ?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
public class ConnectionDecorator implements Connection {
private Connection con = null ;
public ConnectionDecorator(Connection con) {
this .con = con;
}
public void close() throws SQLException {
// 重寫!
}
public void commit() throws SQLException {
this .con.commit();
}
public Statement createStatement() throws SQLException {
return this .con.createStatement();
}
public Statement createStatement( int resultSetType, int resultSetConcurrency)
throws SQLException { return this .con.createStatement(resultSetType, resultSetConcurrency);
}
......
}
|
然後經過連線池控制的 Connection 物件都使用該裝飾器進行包裝
二:動態代理:
使用動態代理重新實現 close 方法,每個獲得 Connection 是一個代理後的物件。
一個完善的連線池,其架構設計非常複雜,Connection#close 問題就是連線池諸多設計難點當中的一個。