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