运行此代码时,我收到 ResultSet 关闭错误。调用的方法和数据如下:
日志输出:
[2014-05-05 22:34:09.169 Debug] select count(*) as total from companies
[2014-05-05 22:34:09.170 Debug] ResultSet closed
方法:
public static Boolean recordsExist(String string, Connection c) {
try {
String[] query = string.split("\\*");
String sql = "select count(*) as total" + query[1];
ResultSet resultset = queryDB(sql, c);
resultset.next();
int count = resultset.getInt(1);
Log.debug(Integer.toString(count));
resultset.close();
if (count > 0) {
Log.debug("recordsExist returning true");
return true;
} else {
Log.debug("recordsExist returning false");
return false;
}
} catch (Exception e) {
Log.debug(e.getMessage());
return false;
}
}
public static ResultSet queryDB(String sql, Connection c) throws SQLException {
Log.debug(sql);
Statement s = c.createStatement();
ResultSet resultset = s.executeQuery(sql);
s.close();
return resultset;
}
指定的 SQL 字符串:
select * from companies
最佳答案
来自Java API :
Note:When a Statement object is closed, its current ResultSet object, if one exists, is also closed.
在关闭Statement
之前,您需要处理ResultSet中的数据。沿着这些思路的东西应该有效:
public static Boolean recordsExist(String string, Connection c) {
try {
String[] query = string.split("\\*");
String sql = "select count(*) as total" + query[1];
return queryDB(sql, c);
} catch (Exception e) {
Log.debug(e.getMessage());
return false;
}
}
public static boolean queryDB(String sql, Connection c) throws SQLException {
Log.debug(sql);
Statement s = c.createStatement();
ResultSet resultset = s.executeQuery(sql);
boolean result = processResult(resultset);
s.close();
return result;
}
public static boolean processResult(ResultSet resultset) {
resultset.next();
int count = resultset.getInt(1);
Log.debug(Integer.toString(count));
resultset.close();
if (count > 0) {
Log.debug("recordsExist returning true");
return true;
} else {
Log.debug("recordsExist returning false");
return false;
}
}
我还会考虑添加更多错误处理,以确保不会泄漏资源。例如,如果处理结果时发生异常,那么您的语句将无法正确关闭。
关于Java JDBC 结果集已关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23486847/