【发布时间】:2010-09-11 08:41:32
【问题描述】:
我一直在对我们的一个宠物项目进行代码审查(主要使用 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。
当连接关闭时,您是否遇到过结果集和语句未关闭的问题?
我只找到了this,它指的是 Oracle 在关闭连接时遇到关闭 ResultSets 的问题(我们使用 Oracle db,因此我进行了更正)。 java.sql.api 在 Connection.close() javadoc 中什么也没说。
【问题讨论】:
-
我强烈推荐使用 Apache commons-dbutils (commons.apache.org/dbutils),它是一个轻量级的 JDBC 库,真正清理了很多样板 JDBC 代码。
-
这是一种当他们不关闭相关对象时遇到的错误 - “ORA-01000: 超出最大打开游标” - stackoverflow.com/questions/12192592/…
-
数据库游标 - stackoverflow.com/questions/3861558/… 游标是一种工具,允许您迭代集合中的记录。它有顺序和当前记录的概念。