我正在開發一個使用連接池的大型應用程序,並使用其連接使用大量類。 最近我們遇到了一些問題,因爲有些類在調用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.
}
}
然而,我發現沒有辦法恢復從連接接口的語句。
所以:
- 這甚至可能,而不必依賴於特定的實現?
- 你會推薦這種方法嗎?
非常感謝,
普約爾
我有完全做到了這一點,在過去,但它需要創建跟蹤創建的每個語句「代理」 JDBC Connection對象,並會關閉它們的連接被「退回」。這是'上個世紀',所以事情可能已經改變,並且,如果我記得,我使用了一個java.lanf.reflect.Proxy – rolfl 2013-05-06 11:08:26