Скажите, я использую подключение к базе данных с именем con
(или сокет или что-нибудь еще, что Closable
). Что происходит после close()
? Значит ли con
равен null
или в нем что-то еще? И в чем разница между con.close()
и con = null
?Правильное использование close() и = null для объектов Closable
4
A
ответ
5
Когда вы вызываете close
, объект должен освобождать все ресурсы, которые он использует за кулисами. В случае примера java.sql.Connection
, это будет одна из двух вещей:
- Бесплатно любое физическое подключение к базе данных, тем самым освобождая ресурсы. Это происходит, когда вы открываете соединение с базой данных вручную, например.
DriverManager.getConnection(...)
. - Перейдите в состояние SLEEPING и подождите, чтобы его снова вызвали. Это происходит, когда
Connection
обрабатываетсяDataSource
, который обрабатывается пулом подключений к базе данных.
Установка объекта con = null
просто присваивает null
значение переменной, ссылка будет по-прежнему жив, пока сборщик мусора не решит удалить его. Тем не менее, установка Connection
на null
не вызывает метод close
, поэтому вы можете иметь утечки памяти.
В качестве лучшей практики, вы должны ВСЕГДА вызов close
метод на случаи Closeable
или использовать try-with-resources
(доступны с Java 7), чтобы убедиться, что ресурс (ы) является (являются) всегда закрыты.
Сказал это лучше, чем я. +1 –
(Установка переменных в нуль практически никогда не требуется, FWIW.) –