我正在使用JDBC从数据库检索数据。我了解,声明需要在使用后关闭。但是,我一直遇到同样的错误,告诉我在语句关闭后不允许任何操作。我的代码的结构就像在JDBC中关闭语句的位置
public void foo() {
Statement;
try {
} catch{
}
Statement.close();
}
在我的代码中,我需要重复调用此函数。我想知道在哪里结束声明。
感谢
我正在使用JDBC从数据库检索数据。我了解,声明需要在使用后关闭。但是,我一直遇到同样的错误,告诉我在语句关闭后不允许任何操作。我的代码的结构就像在JDBC中关闭语句的位置
public void foo() {
Statement;
try {
} catch{
}
Statement.close();
}
在我的代码中,我需要重复调用此函数。我想知道在哪里结束声明。
感谢
根据the JavadocsStatement.close()
释放此Statement对象的数据库和JDBC资源,而不是等待时,自动关闭这种情况发生。一旦您完成了资源释放资源以避免捆绑数据库资源,通常是一种很好的做法。 这意味着你应该在完成后关闭它,而不打算再次使用它。实际上,我会更加关注关闭连接。
在你说你重复呼叫的方法中,你打电话给Statement.close()
这意味着你只能使用它一次,因为在第一次调用你声明关闭并且不能再使用之后。
这将是很高兴看到您的一些代码,如果你想有一个更好的答案
注意,JDBC资源,应该始终被关闭,因此,它能够更好地把那个给“终于”块。
您也可以考虑使用Spring DAO - 它是JDBC之上的一个精简包装器,涵盖了大部分JDBC样板文件。
ResultSets也需要结束。
听起来你可能正在做类似访问Blob的事情,Blob对象通常会通过连接返回来从数据库中读取字节数据。因此,在关闭连接之前,请先读取所有的byte []数据。如果这是不可能的,因为数据量太大,而且您正在尝试传输字节,那么您将不得不将该连接保存在安全的地方,稍后再关闭它。
关闭声明应该进入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);
}
}
}
}
该代码甚至没有编译 - 如果它确实没有多大意义。 – Bombe 2009-10-21 06:46:18
是的 - 部分我很匆忙,而且由于某种原因我得到了代码格式化的问题,我只是放弃了,并带着主要想法去做。虽然我看到我错过了对finally块中的DatabaseUtils.close()方法的调用。下面的人有这样的想法:-) – 2009-10-21 20:23:38
当您关闭语句时,ResultSet会自动关闭。 (请参阅JavaDoc http://download.oracle.com/javase/1.4.2/docs/api/java/sql/Statement。html) – 2011-01-20 09:51:15
一样。在我的实践中,只需将close()放在代码的最后,不再需要额外的行来执行。 – Raptor 2009-10-21 03:55:41
使用Java 7,您可以使用AutoCloseable对JDBC语句的支持:'try(Statement statement = ....){/ * use statement,它会自动关闭* /}'这样可以节省您编写'finally'块。 – Kay 2013-02-20 19:28:26