我一直在对我们的一个宠物项目进行代码审查(主要使用 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 或 Statements。
当连接关闭时,您是否遇到过结果集和语句未关闭的问题?
我只发现了这个,它指的是 Oracle 在关闭连接时遇到关闭 ResultSets 的问题(我们使用 Oracle db,因此我进行了更正)。java.sql.api 在 Connection.close() javadoc 中什么也没说。