在 JDBC 中哪里关闭语句

问题描述 投票:0回答:3

我正在使用 JDBC 从数据库检索数据。据我了解,Statement 在使用后需要关闭。但是,我不断遇到同样的错误,告诉我在语句关闭后不允许进行任何操作。我的代码的结构是这样的

public void foo() {

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

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

谢谢

java jdbc
3个回答
5
投票

根据 Javadocs

Statement.close()
立即释放此Statement对象的数据库和JDBC资源,而不是等待它自动关闭时发生。通常,在使用完资源后立即释放资源是一种很好的做法,以避免占用数据库资源。

这意味着您应该在完成后关闭它并且不打算再次使用它。实际上,我会更加注意关闭您的连接。

在您所说的重复调用的方法中,您正在调用

Statement.close()
,这意味着您只能使用它一次,因为在第一次调用后,您的Statement已关闭并且无法再使用。

如果您想要更好的答案,很高兴看到您的一些代码


2
投票

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

您还可以考虑使用 Spring DAO - 它是 JDBC 之上的一个薄包装器,涵盖了大部分 JDBC 样板内容。


1
投票
  1. ResultSets 也需要关闭。

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

  3. 关闭语句应该进入finally块,并受到空保护 - 但它是如此常见和丑陋的代码,所以坚持在某个地方的静态方法。


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);
            }
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.