我正在使用 JDBC 从数据库检索数据。据我了解,Statement 在使用后需要关闭。但是,我不断遇到同样的错误,告诉我在语句关闭后不允许进行任何操作。我的代码的结构是这样的
public void foo() {
Statement;
try {
} catch{
}
Statement.close();
}
在我的代码中,我需要重复调用这个函数。我想知道在哪里关闭声明。
谢谢
根据 Javadocs:
立即释放此Statement对象的数据库和JDBC资源,而不是等待它自动关闭时发生。通常,在使用完资源后立即释放资源是一种很好的做法,以避免占用数据库资源。Statement.close()
这意味着您应该在完成后关闭它并且不打算再次使用它。实际上,我会更加注意关闭您的连接。
在您所说的重复调用的方法中,您正在调用
Statement.close()
,这意味着您只能使用它一次,因为在第一次调用后,您的Statement已关闭并且无法再使用。
如果您想要更好的答案,很高兴看到您的一些代码
请注意,JDBC 资源应始终关闭,因此,最好将其放在 'finally' 块中。
您还可以考虑使用 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);
}
}
}
}