在JDBC中关闭语句的位置

时间:2009-10-21 03:37:07

标签: java jdbc

我正在使用JDBC从数据库中检索数据。我知道声明需要在使用后关闭。但是,我一直遇到同样的错误,告诉我语句关闭后不允许任何操作。我的代码结构就像

public void foo() {

Statement;
try {
} catch{
}
Statement.close();
}

在我的代码中,我需要重复调​​用此函数。我想知道在哪里关闭声明。

由于

3 个答案:

答案 0 :(得分:4)

根据the Javadocs Statement.close()立即释放此Statement对象的数据库和JDBC资源,而不是等待它自动关闭时发生。通常,最好在完成资源后立即释放资源,以避免占用数据库资源。 这意味着您应该在完成后关闭它,而不打算再次使用它。我会更加注意关闭你的连接。

在你说你反复调用的方法中,你正在调用Statement.close()这意味着你只能使用它一次,因为在第一次调用之后你声明已关闭且不能再使用了。

如果您想要更好的答案,可以看一些代码

答案 1 :(得分:2)

请注意,应始终关闭JDBC资源,因此最好将其放在'finally'块中。

您还可以考虑使用Spring DAO - 它是一个基于JDBC的瘦包装器,涵盖了大多数JDBC样板文件。

答案 2 :(得分:0)

  1. 结果集也需要关闭。

  2. 听起来您可能正在执行类似访问Blob的操作,Blob对象通常会通过连接返回以从数据库中读取字节数据。因此,在关闭连接之前,请先读取所有byte []数据。如果这是不可能的,因为有太多的数据并且你正在尝试流式传输字节,那么你只需要将连接保持在安全的地方并稍后再调用它。

  3. 关闭语句应该进入finally块,并且保护为空 - 但它是如此常见且丑陋的代码,所以坚持使用静态方法。


  4. public List someMethod() {
    
        Statement stmt;
        ResultSet rset;
        try {
            stmt = con.createStatement();
            rset = stmt.executeQuery(....);
    
            List resultList =   ...create   a   list
                                // get the data from the rset
    
                                return resultList;
        } catch (SQLException ex) {
            throw   new MyDatabaseException(ex);
        } finally {
        }
    
    }
    
    public class DatabaseUtils {
    
        public void close(Statement stmt, ResultSet rset) {
            try {
                if (rset != null)   {
                    rset.close();
                }
            } catch (SQLException ex) {
                throw new MyDatabaseException(ex);
            } finally {
                if (stmt != null)   {
                    throw new MyDatabaseException(ex);
                }
            }
        }
    }