Закрытие соединения jdbc и завершение подготовки

Привет всем, я знал, что это старый вопрос, но сегодня он просто любопытен. Как мы знаем, connection.close также закроет подготовленное состояние (поправьте меня, если я ошибаюсь). но что, если я закрою соединение, а затем закрою подготовленное заявление

conn.close();
ps.close();

Получу ли я исключение с нулевым указателем?

Кто-то сказал, что зависит от вашей скорости jvm. Иногда ps.close () будет работать впереди и закроется первым, прежде чем conn.close завершит свою работу, и поэтому вы не получите нулевой указатель.

Чтобы проверить это, я изменил код

conn.close();
Thread.sleep(5000);//I give 5s to conn.close to finish his work. should be enough
ps.close();

Но я не получил нулевого указателя.

Итак, мой вопрос: что здесь произошло, если я сначала закрою conn, а затем ps.

Спасибо всем.


person Job Smith    schedule 04.09.2012    source источник
comment
Почему вы получите исключение с нулевым указателем? Какая переменная стала нулевой? Однако вам непременно следует закрыть ресурсы в порядке, обратном их получению, в данном случае PreparedStatement перед ConnectionResultSet перед PreparedStatement).   -  person user207421    schedule 25.02.2020


Ответы (2)


В JavaDoc для Statement.close() указано:

Вызов метода close для уже закрытого Statement объекта не имеет никакого эффекта.

Я бы предположил, что это означает, что реализация не должна генерировать исключений, если ваш оператор уже был закрыт вызовом Connection.close().

person Duncan Jones    schedule 04.09.2012

В соответствии с javadoc интерфейса утверждения

close
void close()
           throws SQLExceptionReleases this Statement object's database and JDBC resources immediately instead of waiting for this to happen when it is automatically closed. It is generally good practice to release resources as soon as you are finished with them to avoid tying up database resources. 
**Calling the method close on a Statement object that is already closed has no effect.** 

Так что не возникнет проблем, если вы закроете уже закрытый Заявление.

person Metalhead    schedule 04.09.2012