咱們在平時項目中用到了數據庫鏈接池,好比c3p0,dbcp,jndi... java
在使用結束的時候咱們也要關閉鏈接。爲何呢。具體解釋以下: sql
使用 c3p0 的話,也是 java.sql.Connection,只要是 JDBC 都是這個接口的對象! 數據庫
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 問題就是鏈接池諸多設計難點當中的一個。