SQLServerException结果集已关闭

时间:2015-02-17 13:11:52

标签: java sql database

我收到'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;
    }
}

1 个答案:

答案 0 :(得分:2)

finally块被称为before the return is evaluated,当您返回值时,结果集已经关闭。

尝试以这种方式更改代码:

boolean output = resultSet.next();
return output;

请参阅this question

编辑:

总是如此。我已经创建了一个测试来证明我的观点:

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保持复制的值。