每次重新评估时都需要关闭准备好的语句,否则我可以在最后做一次

Posted

技术标签:

【中文标题】每次重新评估时都需要关闭准备好的语句,否则我可以在最后做一次【英文标题】:Is need to close prepared statement everytime reassinging it or I can do it once in the end 【发布时间】:2014-07-08 07:12:50 【问题描述】:
    ResultSet rst = stmt.executeQuery();
    PreparedStatement preparedStatement;
    while (rst.next()) 
        Integer languageId = rst.getInt("language_id");
        Map<String, List<UserMessageItem>> listUserMessageItem = new HashMap<String, List<UserMessageItem>>();
        *preparedStatement = connection.prepareStatement(query);*// first assignation of preparedStatement
        preparedStatement.setInt(1, languageId);
        ResultSet resultSet = preparedStatement.executeQuery();

        while (resultSet.next()) 
            //do stuff
             else 
                //do else stuff

    

    *preparedStatement = connection.prepareStatement(DictionaryManager.LOAD_MAX_MESSAGE_ID);*//other assignation of preparedStatement
    ResultSet resultSet = preparedStatement.executeQuery();
    if (resultSet.next()) 
        maxMessageId = resultSet.getInt("MAX(message_id)");
    

    resultSet.close();
    preparedStatement.close();

    rst.close();
    stmt.close();

我必须重构这些东西...请不要关心缺少 try catch finally 块...任何我想问你的问题:我应该在分配新的preparedStatement之前关闭preparedStatement吗?

【问题讨论】:

【参考方案1】:

你必须每次都关闭它。重新分配它会创建一个新的并释放旧的。

【讨论】:

当它被重新分配意味着一个新的和旧的对象会变得无效不是吗? (1) 是和 (2) 否。 “旧的变成空的”是没有意义的。对象不会“变得无效”。在 GC 之前什么都没有发生。这就是为什么你必须关闭它。 @EJP 我应该关闭准备好的语句两次还是使用preparedStatement.close() 关闭所有实例? (有这段代码,它做得很好) 在下一次重新分配之前关闭每个,最后一个在最后。这肯定很明显吗?同样,您应该关闭每个 ResultSet。当您关闭连接时,它们都会关闭,但是如果您将其保留到那时,您会占用服务器资源。 没有“关闭准备好的语句的技巧”。你必须关闭它们。编写原始代码的人要么不知道这一点,要么依赖于连接的最终关闭。这是低质量的代码:不要高估它。我会为每个语句使用一个新的 PreparedStatement 变量。现在你会使用 try-with-resources 代码结构。

以上是关于每次重新评估时都需要关闭准备好的语句,否则我可以在最后做一次的主要内容,如果未能解决你的问题,请参考以下文章

Golang使用准备好的SQL语句

1615 准备好的语句需要在codeigniter中重新准备

MySql“视图”、“准备好的语句”和“准备好的语句需要重新准备”

单例连接 + 单例准备好的语句

如何摆脱 MySQL 错误“需要重新准备准备好的语句”

我可以重新定义相同的准备好的语句吗?