Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.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_Sql_Jdbc - Fatal编程技术网

Java 结果集过早关闭

Java 结果集过早关闭,java,sql,jdbc,Java,Sql,Jdbc,我正在从一个运行的MYSQL数据库编译一个页面变量列表(其中包含一个书籍列表)。在while(rs.next())循环中尝试第二次迭代时,我收到一个SQL异常,表示结果集已经关闭。我看不出这个代码关闭了rs对象 try { stmt = con.createStatement(); ResultSet rs = stmt.executeQuery("SELECT pageURL," + "pageName FROM

我正在从一个运行的MYSQL数据库编译一个页面变量列表(其中包含一个书籍列表)。在while(rs.next())循环中尝试第二次迭代时,我收到一个SQL异常,表示结果集已经关闭。我看不出这个代码关闭了rs对象

try {
    stmt = con.createStatement();
    ResultSet rs =
            stmt.executeQuery("SELECT pageURL," +
                    "pageName FROM pages GROUP BY pageName;");
    ResultSet rs2;
    while(rs.next()) { // Where the error occurs on the second pass
        Page tempP = new Page(rs.getString(1),rs.getString(2));
        rs2 = stmt.executeQuery("SELECT `books`.`itemID`,cost," +
                "title,author,shortD,longD FROM " +
                "books INNER JOIN pages ON " +
                "books.itemID=pages.itemID WHERE " +
                "pageName='" + rs.getString(2) + "';");
        while(rs2.next()) {
            tempP.addBook(new Book(rs2.getInt(1),
                    rs2.getFloat(2),rs2.getString(3),
                    rs2.getString(4),rs2.getString(5),
                    rs2.getString(6)));
        }
        pages.addPage(tempP);
    }
} catch(SQLException e) {
    System.err.print("SQLException: ");
    System.err.println(e.getMessage());
}
以下是pages表的内容:

|pageName  |pageURL    |itemID|
-------------------------------
|Tech Books|./techbooks|1     |
-------------------------------
|Tech Books|./techbooks|2     |
-------------------------------
|Kids Books|./kidsbooks|3     |
-------------------------------
|Kids Books|./kidsbooks|4     |
-------------------------------
|Kids Books|./kidsbooks|5     |
-------------------------------
编辑:


好的,当我再次使用该语句时,结果集似乎变得无效。有人有任何建议来补救这种情况吗?

引用javadocs的声明:

默认情况下,每个语句对象只能同时打开一个ResultSet对象。因此,如果一个ResultSet对象的读取与另一个ResultSet对象的读取交织在一起,则每个ResultSet对象都必须由不同的语句对象生成。如果存在打开的Statement对象,则Statement接口中的所有执行方法都会隐式关闭Statement的当前ResultSet对象


创建两个语句,或者最好使用带绑定变量的PreparedStatements。

引用javadocs for语句:

默认情况下,每个语句对象只能同时打开一个ResultSet对象。因此,如果一个ResultSet对象的读取与另一个ResultSet对象的读取交织在一起,则每个ResultSet对象都必须由不同的语句对象生成。如果存在打开的Statement对象,则Statement接口中的所有执行方法都会隐式关闭Statement的当前ResultSet对象

创建两个语句,或者最好使用带绑定变量的PreparedStatements。

请参阅以下文档:

当生成ResultSet对象的语句对象关闭、重新执行或用于从多个结果序列中检索下一个结果时,ResultSet对象将自动关闭

见以下文件:

当生成ResultSet对象的语句对象关闭、重新执行或用于从多个结果序列中检索下一个结果时,ResultSet对象将自动关闭


您的第二个查询可能存在SQL注入威胁。即使您确信它是安全的,这种编码方式也是不好的,而且还会影响数据库中查询的优化。我确信它是安全的,但您建议如何优化它?@Kevin:使用带绑定变量的PreparedStatement(setString)您的第二个查询可能存在SQL注入威胁。即使您确信它是安全的,这种编码方式也是不好的,它也会影响数据库中查询的优化。我确信它是安全的,但您建议如何优化它?@Kevin:使用带绑定变量的PreparedStatement(setString)