我正在开发一个使用连接池的大型应用程序,并使用其连接使用大量类。 最近我们遇到了一些问题,因为有些类在调用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