我正在开发一个使用连接池的大型应用程序,并且使用其连接有很多类。 最近我们遇到了一些问题,因为有些类在调用connection.close()方法之前没有关闭语句,错误地认为当连接关闭时,任何相关语句也都会关闭。
目前我正在重构一些代码并开发一个抽象类来管理连接(从中获取它们并将它们放回到数据源中)并将语句细节保留在子类中。
为了避免以后与未关闭的语句相关的错误,我考虑在将连接恢复到池之前实现一些检查,如果我发现一些打开的语句要么关闭它们,要么记录警告。
结果类看起来像这样:
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.
}
}
但是,我发现无法从连接接口恢复语句。
所以:
非常感谢,
卡尔斯
答案 0 :(得分:1)
Connection.close
API说
Releases this Connection object's database and JDBC resources immediately instead of waiting for them to be automatically released.
如果它甚至是连接池,其中连接实际上没有关闭,则连接池提供程序有义务关闭此Connection创建的所有语句和ResultSet,这是优秀的提供程序在实践中所做的事情,请参阅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.