每次重新评估时都需要关闭准备好的语句,否则我可以在最后做一次
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 代码结构。以上是关于每次重新评估时都需要关闭准备好的语句,否则我可以在最后做一次的主要内容,如果未能解决你的问题,请参考以下文章
1615 准备好的语句需要在codeigniter中重新准备