我有一个JDBC实用程序类,它将Resultset,Statement和Connection实例保存为全局引用。此类具有基本的两个方法,如'execute'(有一些参数)和'close',并且在execute中,创建了上面的实例,已分配并最终返回创建的Resultset。
'close'方法关闭Resultset,Statement和Connections的所有打开的连接,就像这样。
public void close() {
if (rs != null) {
try {
rs.close();
} catch (SQLException sqlEx) {
sqlEx.printStackTrace();
}
}
if (stmt != null) {
try {
stmt.close();
} catch (SQLException sqlEx) {
sqlEx.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException sqlEx) {
sqlEx.printStackTrace();
}
}
}
我的客户端应用程序我创建了一个实用程序实例,并获得如下的结果集。
ResultSet rs = dbutil.execute(strQuery,values);
如果我使用rs.close
关闭结果集并在我的客户端应用程序中再次使用dbutil.close()
,
rs.close()
,会发生什么?提前致谢
答案 0 :(得分:0)
当Statement对象关闭,重新执行或用于从多个结果序列中检索下一个结果时,Statement对象会自动关闭它生成它的Statement对象。
在已关闭的ResultSet对象上调用close方法是无操作。 请查看Java文档resultset。
答案 1 :(得分:0)
在已关闭的ResultSet对象上调用close()
无效并且不会出错。
如果您只使用rs.close()
,您将泄露语句和连接,这取决于您的应用程序的生存时间以及您是否创建dbutil类的新实例可能会导致数据库错误(对于您的应用程序,由于达到最大打开游标数(由于未关闭的语句)或最大连接数(由于未关闭的连接),因此对于使用相同数据库的其他人而言。
如果您使用的是Java 7,还应考虑让您的dbutil类实现java.lang.AutoCloseable
接口。如果您已将dbutil实例声明为局部变量,则可以使用“try-with-resources”模式。打开与数据库的连接速度相对较慢,因此除非使用连接池,否则应避免在应用程序中多次关闭和重新打开它们。