连接关闭时结果集未关闭?

2022-08-31 21:09:16

我一直在为我们的一个宠物项目和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();
}

但是我在很多项目中都遇到了上述模式(来自相当多的公司),没有人关闭ResultSet或Presence。

在关闭连接时,是否遇到过未关闭结果集和语句的问题?

我只发现了这一点,它指的是Oracle在关闭连接时关闭ResultSets时遇到了问题(我们使用Oracle db,因此我的更正)。java.sql.api 在 Connection.close() javadoc 中什么也没说。


答案 1

仅关闭连接而不关闭结果集的一个问题是,如果连接管理代码使用连接池,则 只会将连接放回池中。此外,某些数据库在服务器上具有游标资源,除非显式关闭该资源,否则将无法正确释放该资源。connection.close()


答案 2

我在Oracle中遇到了未关闭的结果集的问题,即使连接已关闭也是如此。我得到的错误是

"ORA-01000: maximum open cursors exceeded"

所以:总是关闭你的结果集!


推荐