2012-05-15 2 views
2

Рассмотрим следующий кодавтоматическое закрытие множества результатов в Java SQL

ResultSet rs = null; 
Statement st = null; 
try { 
    //do somehting 
} catch (Exception e){ 
    //do something 
} finally { 
    if(st != null){ 
     try { 
     st.close(); 
     } catch (SQLException e) { 
      log.error("Exception while closing statement: " + e); 
     } 
    } 
} 

Вопрос заключается в том, что, когда мы закрываем заявление, будет ли он закрыть набор результатов, а также и мы должны явно закрыть результат установить как этот

if(rs != null){ 
    try { 
    rs.close(); 
    } catch (SQLException e) { 
     log.error("Exception while closing result set: " + e); 
    } 
} 

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

Этот метод может не очистить java.sql.ResultSet

ответ

7

When a Statement object is closed, its current ResultSet object, if one exists, is also closed.

This и this показывает, что Oracle может иметь проблемы, и вы, возможно, придется явно закрывать ResultSet. Но опять же, согласно Javadocs, это не должно быть проблемой. Значит, предупреждение.

+0

любые идеи, то почему FindBugs сообщает о предупреждении для этого? – comatose

+1

Это может быть наследие. IIRC, закрытие ResultSets, когда заявление закрыто, не всегда было в спецификации JDBC (время назад, например, 1.2ish). Вероятно, есть драйверы, которые не делают это должным образом. –

1

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

3

Вы не можете рассчитывать на автоматическое закрытие ResultSet, это зависит от реализации драйвера и того, насколько он уступчив. Лучшая политика заключается в том, чтобы закрыть ResultSet явно.

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