2013-08-13 5 views
0

Я получаю набор результатов уже закрытым, когда я передаю результаты в другой метод. Где я должен закрыть набор результатов.Где закрыть результирующий набор

public void mainTest(){ 

ResultSet rs= pstmt.executeQuery(query); 

List list = populateRS(rs); 

if(rs!=null)rs.close(); 
} 

public List populateRS(ResultSet rs){ 

//work with result set 
if(rs!=null)rs.close(); 
} 

ответ

5

Вы должны, вероятно, использовать try-finally блок, чтобы закрыть ResultSet даже если populateRS (или что-то другое) бросает исключение:

ResultSet rs; 
try { 
    rs = pstmt.executeQuery(query); 
    List list = populateRS(rs); 
} finally { 
    if (rs != null) { 
     rs.close(); 
    } 
} 
+0

Так что я должен закрыть результирующий набор в mainTest не в populateRS.is это? public void mainTest() {ResultSet rs = pstmt.executeQuery (запрос); Список list = populateRS (rs); если (Rs = нуль!) rs.Close(); } public List populateRS (ResultSet rs) {// работа с набором результатов} – Jaque

+0

Да, я думаю, что всегда проще (и менее подвержен ошибкам) ​​создавать и закрывать 'ResultSet' одним методом и позволять любому другому методу позвоните, просто займитесь обработкой результатов сами (не беспокоясь об открытии, закрытии, проверке, если он уже открыт, ...). – andersschuller

+0

, но в этом случае я исчерпал ошибку набора результатов. – Jaque

1

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

+0

Так я должен закрыть набор результатов в mainTest не populateRS.is это? public void mainTest() { ResultSet rs = pstmt.executeQuery (query); Список list = populateRS (rs); if (rs! = Null) rs.close(); } populateRS Публичный список (ResultSet RS) { // работа с результирующего набора } – Jaque

+0

Я думаю, что это часто подходит для методов, чтобы закрыть то, что другой проход к нему, до тех пор, пока договор ясно. Это часто делается с потоками. –

+0

@Jaque: да. вы можете поместить rs.close в блок finally или использовать try-with-resources. –

0

Вы должны закрыть ResultSet в методе mainTest отделить участие populateRS метод в жизненном цикле ResultSet.

У вас должен быть блок finally, в котором вы должны закрыть ResultSet. Эта практика дает вам гарантию, что ResultSet закрыт, даже если выбрано исключение.

+1

Я не согласен; ответственность populateRS должна заключаться в том, чтобы работать с набором результатов, а не участвовать в его жизненном цикле. Основное разделение проблем. –

4

Закрыть в том же методе вы открываете, если это вообще возможно. Последовательное выполнение этого упрощает, чтобы разработчики и разработчики кода легко сортировали ресурсы (явно освобожденные, явно проблематичные, и нуждались в большем внимании).

Несколько другие ноты:

  1. Использование try (...) или сделать закрытие в finally поэтому ресурс закрыт, даже если код, используя его не удается с исключением.
  2. Используйте аннотации @WillClose and @WillNotClose, если необходимо, чтобы IDE и инструменты, такие как findbugs, могли указывать на проблемы.

public void mainTest(){ 
    List<?> list; 
    try (ResultSet rs = pstmt.executeQuery(query)) { 
    list = populateRS(rs); 
    } 
    // work with list 
} 

public List<?> populateRS(@WillNotClose ResultSet rs){ 
    //work with result set 
} 

или если вы застряли со старыми Java:

public void mainTest(){ 
    List<?> list; 
    ResultSet rs = pstmt.executeQuery(query); 
    try { 
    list = populateRS(rs); 
    } finally { 
    if(rs!=null)rs.close(); 
    } 
    // work with list 
} 
+1

Откуда появилась аннотация «@ WillNotClose»? Это часть JDK или какой-либо другой библиотеки? – andersschuller

+0

@andersschuller JSR-305 –

+0

@andersschuller, см. Ссылку, которую я добавил. –

2

Это хорошо, чтобы закрыть, где вы открываете.
Это хорошая практика программирования, чтобы закрыть все ресы в наконец блок

 public void mainTest() 
     { 
     ResultSet rs = null; 
     try{ 
       rs= pstmt.executeQuery(query); 
      List list = populateRS(rs); 
      }finally{ 
       try { 
       rs.close(); 
       } catch (SQLException ex) { 

       } 
      } 
     } 

    public List populateRS(ResultSet rs){ 

     //work with result set 

    } 

в соответствии с Явы docs

Ввод кода очистки в окончательно блоке всегда хорошая практика, даже если никаких исключений не ожидается.

2

Используйте новый try-with-resources statement, который будет автоматически закрывать ResultSet происходит ли исключение или нет, потому что он реализует AutoCloseable.

Оператор try-with-resources - это оператор try, который объявляет один или несколько ресурсов.Ресурс - это объект, который должен быть закрыт после завершения программы. Оператор try-with-resources гарантирует, что каждый ресурс будет закрыт в конце инструкции.

public void mainTest() 
{ 
    try (ResultSet rs = pstmt.executeQuery(query)) { 
    List list = populateRS(rs); 
    } catch (SQLException ex) { 

    } 
} 

public List populateRS(ResultSet rs){ 
    // work with result set 
} 
+0

Только с Java 7 на. –

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