2009-10-21 33 views
0

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

public void foo() { 

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

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

感谢

回答

4

根据the JavadocsStatement.close()释放此Statement对象的数据库和JDBC资源,而不是等待时,自动关闭这种情况发生。一旦您完成了资源释放资源以避免捆绑数据库资源,通常是一种很好的做法。 这意味着你应该在完成后关闭它,而不打算再次使用它。实际上,我会更加关注关闭连接。

在你说你重复呼叫的方法中,你打电话给Statement.close()这意味着你只能使用它一次,因为在第一次调用你声明关闭并且不能再使用之后。

这将是很高兴看到您的一些代码,如果你想有一个更好的答案

+0

一样。在我的实践中,只需将close()放在代码的最后,不再需要额外的行来执行。 – Raptor 2009-10-21 03:55:41

+1

使用Java 7,您可以使用AutoCloseable对JDBC语句的支持:'try(Statement statement = ....){/ * use statement,它会自动关闭* /}'这样可以节省您编写'finally'块。 – Kay 2013-02-20 19:28:26

2

注意,JDBC资源,应该始终被关闭,因此,它能够更好地把那个给“终于”块。

您也可以考虑使用Spring DAO - 它是JDBC之上的一个精简包装器,涵盖了大部分JDBC样板文件。

0
  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); 
      } 
     } 
    } 
} 
+1

该代码甚至没有编译 - 如果它确实没有多大意义。 – Bombe 2009-10-21 06:46:18

+0

是的 - 部分我很匆忙,而且由于某种原因我得到了代码格式化的问题,我只是放弃了,并带着主要想法去做。虽然我看到我错过了对finally块中的DatabaseUtils.close()方法的调用。下面的人有这样的想法:-) – 2009-10-21 20:23:38

+1

当您关闭语句时,ResultSet会自动关闭。 (请参阅JavaDoc http://download.oracle.com/javase/1.4.2/docs/api/java/sql/Statement。html) – 2011-01-20 09:51:15