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

Posted

技术标签:

【中文标题】即使 PreparedStatement 仅使用一次,ResultSet 关闭错误后也不允许操作【英文标题】:Operation not allowed after ResultSet closed error even if the PreparedStatement is used only once 【发布时间】:2017-03-02 04:11:46 【问题描述】:

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

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

getSQLConnection() 方法返回一个全新的连接。 报错就行了: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】:

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

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

    // process result set here

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

【讨论】:

以上是关于即使 PreparedStatement 仅使用一次,ResultSet 关闭错误后也不允许操作的主要内容,如果未能解决你的问题,请参考以下文章

为啥即使没有争用,我的 Oracle PreparedStatement 有时也不会返回?

使用 PreparedStatement 插入并为插入的行返回一列的值

JDBC深入理解Statement和PreparedStatement

回头探索JDBC及PreparedStatement防SQL注入原理

为啥即使使用仅索引扫描 PostgresQL 计数也如此缓慢

一种不太合规的PreparedStatement使用方式