Я занимался проверкой кода (в основном с использованием таких инструментов, как FindBugs) одного из наших любимых проектов, и FindBugs пометил следующий код как ошибочный (псевдокод):
Connection conn = dataSource.getConnection();
try{
PreparedStatement stmt = conn.prepareStatement();
//initialize the statement
stmt.execute();
ResultSet rs = stmt.getResultSet();
//get data
}finally{
conn.close();
}
Ошибка состояла в том, что этот код может не высвобождать ресурсы. Я понял, что ResultSet и Statement не были закрыты, поэтому я закрыл их, наконец:
finally{
try{
rs.close()
}catch(SqlException se){
//log it
}
try{
stmt.close();
}catch(SqlException se){
//log it
}
conn.close();
}
Но я сталкивался с вышеуказанным паттерном во многих проектах (от довольно многих компаний), и никто не закрывал ResultSets или Statementments.
Были ли у вас проблемы с закрытием ResultSets и выписок при закрытии соединения?
Я нашел только this , и это относится к Oracle, имеющему проблемы с закрытием ResultSets при закрытии Connections (мы используем Oracle db, отсюда и мои исправления). java.sql.api ничего не говорит в javadoc Connection.close ().