Jdbc 每次重申时都需要关闭准备好的声明,或者我最终可以做一次 ResultSet rst=stmt.executeQuery(); 编制报表编制报表; while(rst.next()){ 整数languageId=rst.getInt(“语言id”); Map listUserMessageItem=new HashMap(); *preparedStatement=connection.prepareStatement(查询);*//preparedStatement的第一次赋值 preparedStatement.setInt(1,languageId); ResultSet ResultSet=preparedStatement.executeQuery(); while(resultSet.next()){ //做事 }否则{ //做其他事情 } *preparedStatement=connection.prepareStatement(DictionaryManager.LOAD_MAX_MESSAGE_ID);*//preparedStatement的其他赋值 ResultSet ResultSet=preparedStatement.executeQuery(); if(resultSet.next()){ maxMessageId=resultSet.getInt(“MAX(message_id)”); } resultSet.close(); preparedStatement.close(); rst.close(); stmt.close();

Jdbc 每次重申时都需要关闭准备好的声明,或者我最终可以做一次 ResultSet rst=stmt.executeQuery(); 编制报表编制报表; while(rst.next()){ 整数languageId=rst.getInt(“语言id”); Map listUserMessageItem=new HashMap(); *preparedStatement=connection.prepareStatement(查询);*//preparedStatement的第一次赋值 preparedStatement.setInt(1,languageId); ResultSet ResultSet=preparedStatement.executeQuery(); while(resultSet.next()){ //做事 }否则{ //做其他事情 } *preparedStatement=connection.prepareStatement(DictionaryManager.LOAD_MAX_MESSAGE_ID);*//preparedStatement的其他赋值 ResultSet ResultSet=preparedStatement.executeQuery(); if(resultSet.next()){ maxMessageId=resultSet.getInt(“MAX(message_id)”); } resultSet.close(); preparedStatement.close(); rst.close(); stmt.close();,jdbc,prepared-statement,Jdbc,Prepared Statement,我必须重构这些东西…请不要在意try-catch-finally块的缺席…我想问你:我应该在分配新的preparedStatement之前关闭preparedStatement吗?你每次都必须关闭它。重新分配它会创建一个新的语句并释放旧的语句。当它被重新分配时,意味着一个新的语句和一个旧的对象ts会变为void,是吗?(1)是和(2)否。“旧的变为void”毫无意义。对象不会变为void。它在GC之前不会发生任何变化。这就是为什么必须关闭它。@EJP我应该关闭preparedStatement两

我必须重构这些东西…请不要在意try-catch-finally块的缺席…我想问你:我应该在分配新的preparedStatement之前关闭preparedStatement吗?

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

当它被重新分配时,意味着一个新的语句和一个旧的对象ts会变为void,是吗?(1)是和(2)否。“旧的变为void”毫无意义。对象不会变为void。它在GC之前不会发生任何变化。这就是为什么必须关闭它。@EJP我应该关闭preparedStatement两次,还是使用preparedStatement.close()关闭所有实例?(有此代码,它做得很好)在下一次重新分配之前关闭每一个结果集,在最后关闭最后一个结果集。这显然是显而易见的吗?同样,你应该关闭每个结果集。当你关闭连接时,它们确实都会关闭,但如果你将连接留到那时,你会占用服务器资源。没有“关闭准备好的语句的诀窍”。你必须关闭它们。无论是谁编写了原始代码可能不知道这一点,或者依赖于连接的最终关闭。这是低质量的代码:不要高估它。我会为每个语句使用一个新的PreparedStatement变量。现在,您将使用try with resources代码结构。
    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();