2015-10-02 2 views
2

Нужно ли закрывать ResultSet и PreparedStatement в течение одного db.getConnection()? Для примера ниже:Необходимо закрыть PreparedStatement перед подготовкой другого заявления

Connection conn = db.getConnection(); 
PreparedStatement pstmt = conn.prepareStatement(firstsql); 
ResultSet r = pstmt.executeQuery(); 
// do something with the ResultSet 
r.close(); 
pstmt.close(); // do I need close the r and pstmt here? 
PreparedStatement pstmt = conn.prepareStatement(secondsql); 
ResultSet r = pstmt.executeQuery(); 
// do something with the ResultSet again 
r.close(); 
pstmt.close(); 
conn.close(); 
return null; 

Нужны ли коды строк 5 и строки 6?

ответ

8

Строго говоря, это не обязательно, потому что вы можете одновременно открывать несколько подготовленных операторов. Необходимо, чтобы закрывал каждый открытый ресурс, если он не будет использоваться позже.

Рассматривая свой код, он не гарантирует, что утверждение фактически закрыто.

Чтобы обеспечить это, каждая операция закрытия должна выполняться внутри блока finally: таким образом, он выполнит выполнение операции или нет.

Пример кода:

PreparedStatement pstmt = null; 
ResultSet r = null; 
try { 
    pstmt = conn.prepareStatement(firstsql); 
    r = pstmt.executeQuery(); 
    // do something with the ResultSet 
} finally { 
    if (r != null) { 
     try { 
      r.close(); 
     } catch (SQLException e) { 
      //log error 
     } 
    } 
    if (pstmt != null) { 
     try { 
      pstmt.close(); 
     } catch (SQLException e) { 
      //log error 
     } 
    } 
} 
//and do it again 

Этот код может быть значительно упрощается, если вы используете Java 7 с try-with-resources высказыванием:

try (PreparedStatement pstmt = conn.prepareStatement(firstsql); 
     ResultSet r = pstmt.executeQuery();) { 
    // do something with the ResultSet 
} 
+0

Либо вы не ответили на вопрос, либо вы ответили неправильно. – EJP

+0

@EJP Что не так: «Каждый ресурс должен быть закрыт после использования»? Он не открывает несколько утверждений, он использует одну и ту же переменную. – Tunaki

+0

Вопрос в том, «нужно ли закрыть подготовленное заявление перед тем, как открыть другое», а ответ - нет. Его код не компилируется, но если бы он это сделал, он действительно открыл бы несколько операторов, и он также имел бы утечку ресурсов. – EJP

3

Нет, вы можете иметь несколько операторов открыть на в то же время. Но вы должны закрыть их в конце концов.

Код, который вы опубликовали, не скомпилирован, и если бы это произошло, у него была бы утечка ресурсов, но это другая проблема из вопроса в вашем заголовке.

+0

Спасибо. Я понимаю, что вы подразумеваете под «Нет» и «утечкой ресурсов» после прочтения всех комментариев. – Cuero

Смежные вопросы