使用數據庫鏈接池是否須要關閉Connection

咱們在平時項目中用到了數據庫鏈接池,好比c3p0,dbcp,jndi... java

在使用結束的時候咱們也要關閉鏈接。爲何呢。具體解釋以下: sql

使用 c3p0 的話,也是 java.sql.Connection,只要是 JDBC 都是這個接口的對象! 數據庫


使用完後必須 con.close()  使用鏈接池的話,執行 con.close 並不會關閉與數據庫的 TCP 鏈接,而是將鏈接還回到池中去,若是不 close 掉的話,這個鏈接將會一直被佔用,直接鏈接池中的鏈接耗盡爲止。

至因而如何作到 con.close 並非真正意義上的關閉鏈接?而是直接將鏈接還回到池中去?

通常有兩種方式:

一:使用裝飾器模式,在裝飾器構造中傳入一個真正的 Connection,這個裝飾器實現 Connection,使用構造 傳入 Connection 委託重寫全部方法,並改寫 close 方法:
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 問題就是鏈接池諸多設計難點當中的一個。
相關文章
相關標籤/搜索