即使PreparedStatement仅使用一次,ResultSet关闭错误后也不允许操作

时间:2017-03-02 04:11:46

标签: java sql

每当我尝试获取ResultSet时,都会收到此错误。我在网上看了很长时间,有很多人和我有同样的问题,但他们的问题是他们使用PreparedStatement进行多次查询。

正如您在以下代码中看到的,我只使用了一次PreparedStatement。

getSQLConnection()方法返回一个全新的Connection。 错误被抛出:ResultSet rs = ps.executeQuery()

    try (Connection connection = getSQLConnection();
            PreparedStatement ps = connection.prepareStatement(qry);
            ResultSet rs = ps.executeQuery()) {

        return rs;

    } catch (SQLException ex) {
        plugin.get().getLogger().log(Level.SEVERE, "Couldn't execute SQL statement: ", ex);
    }

之前我使用过SQL数据库,但从未这样做过。我很迷惑。希望你们能帮助我!

1 个答案:

答案 0 :(得分:2)

当你使用try with resources时,你告诉Java在块本身完成执行后关闭try子句中的所有资源。正如您所编写的那样,这包括ResultSet,这意味着任何调用您的方法的人将永远无法使用该结果集。相反,您应该在try块中处理结果集:

try (Connection connection = getSQLConnection();
        PreparedStatement ps = connection.prepareStatement(qry);
        ResultSet rs = ps.executeQuery()) {

    // process result set here
}

除了结果集将在调用者接收它时关闭,返回还有另一个问题,即JDBC调用的清理现在必须在两个地方完成。这是非常不受欢迎的,也是一个维护问题。