Этот ресурс jdbc закрыт? - PullRequest
       1

Этот ресурс jdbc закрыт?

3 голосов
/ 20 августа 2011

Оглядываясь назад, я обнаружил, что время от времени писал:

ResultSet rs = conn.createStatement().executeQuery("select * from main");
//snip
rs.close();

и иногда я писал

Statement st = conn.createStatement();
ResultSet rs = st.executeQuery("Select * from main");
//snip
rs.close();
st.close();

Во втором сегменте кода более очевидно, что Statement закрыт, но он также закрыт в первом? conn.createStatement () возвращает объект оператора, но когда он создается таким образом, я не вижу простого способа закрыть его после завершения. Должен ли я просто переписать различные биты кода для использования метода # 2?

Ответы [ 3 ]

2 голосов
/ 20 августа 2011

Хорошей практикой является добавление rs.close() и st.close() в ваше предложение finally.

Statement st;
ResultSet rs;

try {
   st = connection.createStatement(...);
   rs = st.executeQuery();
}
catch (JdbcErrorsExceptionsAndFoo exception) {
   // yadda yadda
}
finally {
    if (rs!= null) {
        rs.close();
    }
    if (st != null) {
        st.close();
    }
}
1 голос
/ 20 августа 2011

если оператор содержит результирующий набор, gc не собирает его.Вы можете использовать второй метод или использовать аспекты или фильтры для их автоматического закрытия.

1 голос
/ 20 августа 2011

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

Обратите внимание, однако, что реверс действительно работает. То есть закрытие Statement также закрывает ResultSet, связанный с ним.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...