我正在使用JDBC从数据库中检索数据。我知道声明需要在使用后关闭。但是,我一直遇到同样的错误,告诉我语句关闭后不允许任何操作。我的代码结构就像
public void foo() {
Statement;
try {
} catch{
}
Statement.close();
}
在我的代码中,我需要重复调用此函数。我想知道在哪里关闭声明。
由于
答案 0 :(得分:4)
根据the Javadocs Statement.close()
立即释放此Statement对象的数据库和JDBC资源,而不是等待它自动关闭时发生。通常,最好在完成资源后立即释放资源,以避免占用数据库资源。
这意味着您应该在完成后关闭它,而不打算再次使用它。我会更加注意关闭你的连接。
在你说你反复调用的方法中,你正在调用Statement.close()
这意味着你只能使用它一次,因为在第一次调用之后你声明已关闭且不能再使用了。
如果您想要更好的答案,可以看一些代码
答案 1 :(得分:2)
请注意,应始终关闭JDBC资源,因此最好将其放在'finally'块中。
您还可以考虑使用Spring DAO - 它是一个基于JDBC的瘦包装器,涵盖了大多数JDBC样板文件。
答案 2 :(得分:0)
结果集也需要关闭。
听起来您可能正在执行类似访问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);
}
}
}
}