Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java结果集未正确关闭_Java_Plsql_Try Catch_Resultset_Database Cursor - Fatal编程技术网

Java结果集未正确关闭

Java结果集未正确关闭,java,plsql,try-catch,resultset,database-cursor,Java,Plsql,Try Catch,Resultset,Database Cursor,我有一个Java应用程序,其中包含许多代码片段,如下面的示例所示。非常简单的Oracle数据库查询。返回并解析有效数据,然后调用close()函数 ResultSet rs = null; Statement stmt = null; try { stmt = conn.createStatement(); rs = stmt.executeQuery("SELECT * FROM example"); while (rs.next()) { /

我有一个Java应用程序,其中包含许多代码片段,如下面的示例所示。非常简单的Oracle数据库查询。返回并解析有效数据,然后调用close()函数

ResultSet rs = null;
Statement stmt = null;

try
{
    stmt = conn.createStatement();
    rs = stmt.executeQuery("SELECT * FROM example");
    while (rs.next())
    {
        // do stuff
    }

    rs.close();
    stmt.close();
    System.out.println("test1");
}
catch (Exception e)
{
    System.out.println("error1");
}
我开始遇到“超过最大游标数”错误。我检查了我的方法以确定结果集是否未关闭。
catch
子句从未触发,每次都打印“test1”。这意味着不会跳过rs.close()和stmt.close()行。然而结果集实际上并没有被关闭

我添加了一个
finally
子句,它解决了这个问题

finally
{
    if (rs != null)
    {
        try
        {
            rs.close();
            System.out.println("test2");
        }
        catch (Exception e)
        {
            System.out.println("error2");
        }
    }
    if (stmt != null)
    {
        try
        {
            stmt.close();
            System.out.println("test3");
        }
        catch (Exception e)
        {
            System.out.println("error3");
        }
    }
}
输出:

test1
test2
test3
我的问题是,为什么需要调用rs.close()和stmt.close()两次?
try
子句中的调用似乎不起任何作用。然而,我在
finally
子句中再次调用了它们,它们成功了。这怎么可能呢?

使用(Java 7+):

不,不需要打两次电话 不,JDBC中不需要调用两次
close
。我怀疑发生了什么事

我们无法确切地告诉您的代码中发生了什么。我们不知道你所谓的第二个电话是否真的解决了这个问题。例如,文件中说:

对已关闭的语句对象调用close方法无效

利用资源进行尝试 正如建议的那样,您应该尝试使用资源

见:

  • 试着利用资源
  • 若要尝试使用资源,请使用try with Resource语句中先前创建的变量
对于JDBC和任何资源实现,请使用try with resources

您可以在
中放置一个或多个资源,然后尝试(…)
。用分号分隔,最后一个分号是可选的。Java将采取跟踪资源的方法,每个资源都按与打开相反的顺序关闭。如果中间出现异常,java知道不尝试关闭空资源对象。这大大简化了编码

try (Statement stmt = conn.createStatement()) {
    try (ResultSet rs = stmt.executeQuery("SELECT * FROM example")) {
        while (rs.next()) {
            // do stuff
        }
        System.out.println("test1");
    }
} catch (Exception e) {
    System.out.println("error1");
}