2013-05-06 86 views
2

我正在開發一個使用連接池的大型應用程序,並使用其連接使用大量類。 最近我們遇到了一些問題,因爲有些類在調用connection.close()方法之前沒有關閉語句,錯誤地認爲當連接關閉時,任何相關語句也被關閉。查找與連接有關的語句

目前我重構了一些代碼,並開發一個抽象類,會管理的連接(從得到他們,並把它們放回數據源),並留下聲明細節落實到子類。

爲了避免與不關閉的語句未來的錯誤,我想過returing的連接錯誤入池前執行一些檢查,如果我發現一些開語句要麼關閉他們或記錄警告。

生成的類是這樣的:

public abstract class AbstractDatabaseLoader { 

    private DataSource dataSource; 

    public final DatabaseValues load(DatabaseParams params) { 

    DatabaseValues result = null; 
    Connection connection = null; 

    try { 
     connection = dataSource.getConnection(); 
     result = load(connection, params); 
    } catch (Exception ex) { 
     // some logging; 
    } finally { 
     if (connection != null) { 
      try { 
       if (validateStatements(connection)){ 
        logger.warn("The Connection is being returned into the POOL with opened Statments!"); 
       } 
       connection.close(); 
      } catch (SQLException e) { 
       // some logging. 
      } 
     } 
    } 
    return result; 

    } 

    protected abstract DatabaseValues load(Connection connection, DatabaseParams params); 

    private boolean validateStatements(Connection connection){ 
     // Do Something here to validate if statements were properly closed. 
    } 

} 

然而,我發現沒有辦法恢復從連接接口的語句。

所以:

  1. 這甚至可能,而不必依賴於特定的實現?
  2. 你會推薦這種方法嗎?

非常感謝,

普約爾

+0

我有完全做到了這一點,在過去,但它需要創建跟蹤創建的每個語句「代理」 JDBC Connection對象,並會關閉它們的連接被「退回」。這是'上個世紀',所以事情可能已經改變,並且,如果我記得,我使用了一個java.lanf.reflect.Proxy – rolfl 2013-05-06 11:08:26

回答

1

Connection.close API說

Releases this Connection object's database and JDBC resources immediately instead of waiting for them to be automatically released. 

,如果它甚至有一個連接池,其中的連接實際上沒有關閉,它是連接池提供者職責關閉由此連接創建的所有語句和結果集,這是實踐中的好供應商,請參閱commons-dbcp http://commons.apache.org/proper/commons-dbcp/apidocs/org/apache/commons/dbcp/DelegatingConnection.html#close()它說Closes the underlying connection, and close any Statements that were not explicitly closed.

+0

感謝您的迴應。但是,這不適用於我使用OracleDataSource實現的情況。 其實,看着甲骨文[文件](http://docs.oracle.com/cd/B13789_01/java.101/b10979/basic.htm#i1006632)上面清清楚楚地寫着: '你必須明確地關閉ResultSet和Statement對象完成使用後...如果沒有明確關閉ResultSet和Statement對象,則可能發生嚴重的內存泄漏 – 2013-05-06 14:27:12