【问题标题】:SQL Exception Operation not allowed after ResultSet closed, When does it get close?ResultSet 关闭后不允许 SQL 异常操作,何时关闭?
【发布时间】:2021-01-25 17:43:36
【问题描述】:

代码:

protected List<Object> getAll(Pair<String, Object> primaryKey, String columnLabel) {
    List<Object> objects = new ArrayList<>();
    try {
        ResultSet resultSet = getRows(primaryKey);
        while (resultSet.next()) {
            objects.add(resultSet.getObject(columnLabel));
        }
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        return objects;
    }
}

protected ResultSet getRows(Pair<String, Object> primaryKey) {
    try (Connection con = DataSource.getConnection();
         PreparedStatement pst = con.prepareStatement("SELECT * FROM " + table + " WHERE `" + primaryKey.fst + "` = ?")) {
        pst.setObject(1, primaryKey.snd);
        return pst.executeQuery();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}

Error

表的列是:id (int) |播放器(字符串) |朋友(字符串)

因为 id 是自动递增的。

错误指向(第5行):

while (resultSet.next()) {

ResultSet 何时关闭?

SQLEmmber#getAll(Pair primaryKey, String columnLabel) 在SQLFriends.java 中被调用

【问题讨论】:

    标签: java mysql sql jdbc resultset


    【解决方案1】:

    您的方法getRows() 使用包含连接和准备好的语句的try-with-resources 块。在 try-with-resources 块的末尾,这将显式关闭准备好的语句和连接。

    关闭准备好的语句将关闭结果集(关闭连接将关闭所有打开的语句,因此也关闭所有打开的结果集)。

    ResultSet 中所述:

    ResultSet 对象在 Statement 时自动关闭 生成它的对象已关闭、重新执行或用于检索 多个结果序列中的下一个结果。

    您需要重新构建代码,以便仅在从结果集中检索所有行之后关闭连接。

    【讨论】:

      猜你喜欢
      • 2012-03-06
      • 1970-01-01
      • 2012-06-11
      • 2019-11-20
      • 2017-04-17
      • 2018-03-20
      • 1970-01-01
      相关资源
      最近更新 更多