我收到'SQLServerException:0结果集已关闭。结果集已关闭。@ java.lang.Thread:运行:722',代码如下。
我可以看到我没有关闭语句或结果集然后为什么我得到这个异常。
任何人都可以帮忙吗?提前致谢
private boolean isConnectionValid(Connection connection){
//SQL statement to execute the query.
Statement statement = null;
//resultSet receives the result of statement execution.
ResultSet resultSet = null;
//detect the connectivity.
try{
//create a statement.
statement = connection.createStatement();
//define the specific query after the statement is created.
String query = databaseType == DatabaseType.ORACLE? "select 1 from dual" : "select 1";
//apply the statement to execute the query.
resultSet = statement.executeQuery(query);
// if the resultSet.next() returns true, the connection is fine. Otherwise the connection is invalid.
return resultSet.next();
}catch(SQLException e){
//If any SQL Exception is caught, the connection is invalid as well.
Common.logException2(getLogger(), e, null);
return false;
}finally{
//finally close statement and resultSet to prevent cursor leak if any of them is not null.
Common.closeStatementAndResultSet(statement, resultSet, getLogger());
}
我正在使用isConnectionValid方法的一个示例如下:
public boolean execute(Logger logger) throws SQLException {
try {
if( !query.toUpperCase().startsWith("SELECT") ) {
queryLoggerInfo(database.getDbName() + " " + this);
}
return statement.execute();
} catch (SQLException e) {
if (database.isConnectionValid(connectionId)){
//log it
} else {
// other log methods
}
throw e;
}
}
答案 0 :(得分:2)
finally块被称为before the return is evaluated,当您返回值时,结果集已经关闭。
尝试以这种方式更改代码:
boolean output = resultSet.next();
return output;
编辑:
总是如此。我已经创建了一个测试来证明我的观点:
public class Testing {
public static void main(String[] args) {
Testing t = new Testing();
System.out.println("Test1: " + t.getStringListValue());
System.out.println("Test2: " + t.getStringList().size());
}
public String getStringListValue() {
List<String> stringList = new ArrayList<String>();
try {
stringList.add("a");
stringList.add("b");
stringList.add("c");
return stringList.get(2);
} catch (Exception e) {
} finally {
stringList.clear();
}
return null;
}
public List<String> getStringList() {
List<String> stringList = new ArrayList<String>();
try {
stringList.add("a");
stringList.add("b");
stringList.add("c");
return stringList;
} catch (Exception e) {
} finally {
stringList.clear();
}
return null;
}
}
在getStringList()方法中,我在finally块中调用clear(),当我尝试获取大小时,我按预期得到0。
另一方面,在getStringListValue()中,我也调用clear,但是我按照你的建议返回List中第二个元素的值,并且我可以打印它的值。
这里发生的是在返回行中创建了一个指向String对象的指针,并接收了数组中第二个元素的值。因此,finally块中的clear()清除List,但返回String保持复制的值。