即使 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注入原理