ResultSet, не закрытый, когда закрытое соединение?

Указатель NULL - это тот, который указывает на никуда. Когда вы разыскиваете указатель p, вы говорите «дайте мне данные в месте, хранящемся в« p ». Когда p является нулевым указателем, местоположение, хранящееся в p, является nowhere, вы говорите «Дайте мне данные в месте« нигде ». Очевидно, он не может этого сделать, поэтому он выбрасывает NULL pointer exception.

В общем, это потому, что что-то не было правильно инициализировано.

49
задан Machavity 7 October 2018 в 03:02
поделиться

8 ответов

Одна проблема ТОЛЬКО с закрытием соединения а не набора результатов, то, что, если бы Ваш код управления соединениями использует организацию пула подключений, эти connection.close(), просто отложил бы соединение в пуле. Кроме того, некоторая база данных имеет ресурс курсора на сервере, который не будет освобожден правильно, если это не будет явно закрыто.

52
ответ дан bluish 7 November 2019 в 11:25
поделиться

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

Вот служебный метод, который может использоваться от наконец блок:

public static void closeEverything(ResultSet rs, Statement stmt,
        Connection con) {
    if (rs != null) {
        try {
            rs.close();
        } catch (SQLException e) {
        }
    }
    if (stmt != null) {
        try {
            stmt.close();
        } catch (SQLException e) {
        }
    }
    if (con != null) {
        try {
            con.close();
        } catch (SQLException e) {
        }
    }
}
19
ответ дан Stefan Schweizer 7 November 2019 в 11:25
поделиться

У меня были проблемы с открытым ResultSets в Oracle, даже при том, что соединение было закрыто. Ошибка, которую я получил, была

"ORA-01000: maximum open cursors exceeded"

Так: Всегда закрывайте свой ResultSet!

28
ответ дан neu242 7 November 2019 в 11:25
поделиться

Мост ODBC может произвести утечку памяти с некоторыми драйверами ODBC.

при использовании хорошего драйвера JDBC тогда Вы должны не иметь никаких проблем с закрытием соединения. Но существует 2 проблемы:

  • Вы знает, есть ли у Вас хороший драйвер?
  • Вы будете использовать другие драйверы JDBC в будущем?

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

8
ответ дан Horcrux7 7 November 2019 в 11:25
поделиться

Oracle даст Вам ошибки об открытых курсорах в этом случае.

Согласно: http://java.sun.com/javase/6/docs/api/java/sql/Statement.html

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

Все те детали оставляют поставщику драйвера JDBC.

Его всегда самый безопасный закрыть все явно. Мы записали util класс, который обертывает все с попыткой {xxx} выгода (Throwable {} так, чтобы можно было просто назвать Utils.close (RS) и Utils.close(stmt), и т.д. не имея необходимость волноваться по поводу исключений, что закрываются, сканирование, предположительно, бросают.

9
ответ дан John Gardner 7 November 2019 в 11:25
поделиться

Я определенно видел проблемы с открытым ResultSets, и что может повредить закрывать их все время, правильно? Ненадежность необходимости к тому, чтобы не забывать сделать это - одна из лучших причин переместиться в платформы, которые управляют этими деталями для Вас. Это не могло бы быть выполнимо в Вашей среде разработки, но у меня была большая удача с помощью Spring для управления транзакциями JPA. Грязные детали вводных соединений, операторов, наборов результатов и записи сверхсложных блоков попытки/выгоды/наконец (с блоками попытки/выгоды в наконец блоке! ) закрыть их снова просто исчезает, оставляя Вас для фактического получения некоторой сделанной работы. Я настоятельно рекомендовал бы миграцию на такое решение.

4
ответ дан JavadocMD 7 November 2019 в 11:25
поделиться

Я работаю в большой веб-среде J2EE. У нас есть несколько баз данных, которые могут быть подключены с в единственном запросе. Мы начали получать логические мертвые блокировки в некоторых наших приложениях. Проблема была то, что следующим образом:

  1. Пользователь запросил бы, чтобы подключения Сервера страницы
  2. к серверу DB 1
  3. Выбрали на соединении "завершений" сервера DB 1
  4. с подключениями сервера DB 1
  5. к Заведенному в тупик DB 2
  6. !

Это произошло по 2 причинам, мы испытывали намного более высокий объем трафика, чем нормальный, и Спецификация J2EE по умолчанию на самом деле не закрывает Ваше соединение до выполнения концов потока. Так, на вышеупомянутом шаге 4 в качестве примера никогда на самом деле закрыл соединение даже при том, что они были закрыты правильно в наконец.

Для фиксации этого Вы необходимо использовать ссылки ресурса в web.xml для Соединений с базой данных, и необходимо установить res-sharing-scope на нес обеспечением совместного доступа.

Пример:

<resource-ref>
    <description>My Database</description>
    <res-ref-name>jdbc/jndi/pathtodatasource</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
    <res-sharing-scope>Unshareable</res-sharing-scope>
</resource-ref>
8
ответ дан Konrad 7 November 2019 в 11:25
поделиться

В Java Операторы (не Наборы результатов) коррелируют к Курсорам в Oracle. Лучше закрывать ресурсы, которые Вы открываете, поскольку неожиданное поведение может произойти в отношении JVM и системных ресурсов.

Кроме того, некоторый JDBC объединение платформ объединяет Операторы и Соединения, не закрытие их не могло бы отметить те объекты как свободные в пуле, и вызывать проблемы производительности в платформе.

В целом, если существует завершение () или уничтожает () метод на объекте, существует причина звонить, это, и проигнорировать его сделано так в Вашей собственной опасности.

4
ответ дан Spencer Kormos 7 November 2019 в 11:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: