Указатель NULL
- это тот, который указывает на никуда. Когда вы разыскиваете указатель p
, вы говорите «дайте мне данные в месте, хранящемся в« p ». Когда p
является нулевым указателем, местоположение, хранящееся в p
, является nowhere
, вы говорите «Дайте мне данные в месте« нигде ». Очевидно, он не может этого сделать, поэтому он выбрасывает NULL pointer exception
.
В общем, это потому, что что-то не было правильно инициализировано.
Одна проблема ТОЛЬКО с закрытием соединения а не набора результатов, то, что, если бы Ваш код управления соединениями использует организацию пула подключений, эти connection.close()
, просто отложил бы соединение в пуле. Кроме того, некоторая база данных имеет ресурс курсора на сервере, который не будет освобожден правильно, если это не будет явно закрыто.
Необходимо всегда закрывать все ресурсы 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) {
}
}
}
У меня были проблемы с открытым ResultSets в Oracle, даже при том, что соединение было закрыто. Ошибка, которую я получил, была
"ORA-01000: maximum open cursors exceeded"
Так: Всегда закрывайте свой ResultSet!
Мост ODBC может произвести утечку памяти с некоторыми драйверами ODBC.
при использовании хорошего драйвера JDBC тогда Вы должны не иметь никаких проблем с закрытием соединения. Но существует 2 проблемы:
, Что лучшая практика должна закрыть все это.
Oracle даст Вам ошибки об открытых курсорах в этом случае.
Согласно: http://java.sun.com/javase/6/docs/api/java/sql/Statement.html
похоже, что многократное использование оператора закроет любые открытые наборы результатов, и закрытие оператора закроет любые наборы результатов, но я не вижу, что что-либо о закрытии соединения закроет любой из ресурсов, которые это создало.
Все те детали оставляют поставщику драйвера JDBC.
Его всегда самый безопасный закрыть все явно. Мы записали util класс, который обертывает все с попыткой {xxx} выгода (Throwable {} так, чтобы можно было просто назвать Utils.close (RS) и Utils.close(stmt), и т.д. не имея необходимость волноваться по поводу исключений, что закрываются, сканирование, предположительно, бросают.
Я определенно видел проблемы с открытым ResultSets, и что может повредить закрывать их все время, правильно? Ненадежность необходимости к тому, чтобы не забывать сделать это - одна из лучших причин переместиться в платформы, которые управляют этими деталями для Вас. Это не могло бы быть выполнимо в Вашей среде разработки, но у меня была большая удача с помощью Spring для управления транзакциями JPA. Грязные детали вводных соединений, операторов, наборов результатов и записи сверхсложных блоков попытки/выгоды/наконец (с блоками попытки/выгоды в наконец блоке! ) закрыть их снова просто исчезает, оставляя Вас для фактического получения некоторой сделанной работы. Я настоятельно рекомендовал бы миграцию на такое решение.
Я работаю в большой веб-среде J2EE. У нас есть несколько баз данных, которые могут быть подключены с в единственном запросе. Мы начали получать логические мертвые блокировки в некоторых наших приложениях. Проблема была то, что следующим образом:
Это произошло по 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>
В Java Операторы (не Наборы результатов) коррелируют к Курсорам в Oracle. Лучше закрывать ресурсы, которые Вы открываете, поскольку неожиданное поведение может произойти в отношении JVM и системных ресурсов.
Кроме того, некоторый JDBC объединение платформ объединяет Операторы и Соединения, не закрытие их не могло бы отметить те объекты как свободные в пуле, и вызывать проблемы производительности в платформе.
В целом, если существует завершение () или уничтожает () метод на объекте, существует причина звонить, это, и проигнорировать его сделано так в Вашей собственной опасности.