Сборка мусора JDBC - PullRequest
       7

Сборка мусора JDBC

3 голосов
/ 28 декабря 2011

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

Будут ли они закрыты и освобождены сборщиком мусора.

Я спрашиваю это для локальных переменных внутри функции.

Знаете ли вы какую-либо документацию по этому поводу?

Ответы [ 5 ]

9 голосов
/ 28 декабря 2011

Если ваш код не закроет ResultSet с или PreparedStatement с, когда закончите с использованием затем, ваше приложение будет использовать ограниченные ресурсы - например, курсоры - в базе данных. Смотрите, например:

Сборщик мусора ничего не знает о закрытии ResultSet с или PreparedStatement с, поэтому GC автоматически не позаботится об этом за вас. Что будет? оператор Java 7 try с ресурсами !

1 голос
/ 28 декабря 2011

если я не закрою набор результатов или подготовленные операторы. Будут ли они закрыты и освобождены сборщиком мусора.

resultset и preparedstatment закрыты явновызов метода close.Сборщик мусора не закроет их.Если вы не вызываете close, то курсор оракула не освобождается в конце оракула. ​​

Will they be released by the garbage collector.

Обычно объект получает право на сборку мусора в Java в следующих случаях:

  • Все ссылки на этот объект явно установлены на нуль, например, object = null
  • Объект создается внутри блока, и ссылка выходит из области действия после выхода из этого блока.
  • Родительскому объекту присваивается значение null, если объект содержит ссылку на другой объект и когда вы устанавливаете нулевую ссылку на объект контейнера, дочерний или содержащийся объект автоматически становится пригодным для сборки мусора.
  • Если объект имеет только живые ссылки через WeakHashMapон будет иметь право на сборку мусора.

для вашего вопроса: я спрашиваю это для локальных переменных внутри функции.

ResultSet Objectсоздается внутри метода, не закрывается, и ссылка выходит из области видимости, как только управление завершает работу этого метода. , тогда ссылка устанавливаетсяк нулю, и объект имеет право на сборку мусора.Я сказал, что право не гарантировано. Базовый курсор оракула все еще находится в базе данных. Потому что вы не вызывали close.

1 голос
/ 28 декабря 2011

Вы должны явно закрыть объекты ResultSet и Statement после завершения их использования. Это относится ко всем объектам ResultSet и Statement, которые вы создаете при использовании драйверов JDBC. В драйверах нет методов финализатора; процедуры очистки выполняются методом close () классов ResultSet и Statement. Если вы явно не закроете объекты ResultSet и Statement, могут возникнуть серьезные утечки памяти. Вы также можете исчерпать курсоры в базе данных. Закрытие как набора результатов, так и оператора освобождает соответствующий курсор в базе данных; если вы закроете только набор результатов, курсор не будет освобожден

1 голос
/ 28 декабря 2011

Я не эксперт здесь, но я не думаю, что GC может собрать это, так как PS связаны с соединениями с базой данных, так что не будет собираться мусор. Йо может посмотреть здесь: http://www.theserverside.com/news/1365244/Why-Prepared-Statements-are-important-and-how-to-use-them-properly

0 голосов
/ 28 декабря 2011

-> Что произойдет, если я не закрою набор результатов или подготовленные заявления? Будут ли они закрыты и освобождены сборщиком мусора?

Таким образом вы снижаете производительность базы данных и приложения. Вам необходимо закрыть или утилизировать ресурс JDBC .

Объекты

To close or dispose (ресурс JDBC) означают, что эти объекты теперь доступны для сборки мусора, и GC высвободит любые JDBC полученные ресурсы.

В случае объекта ResultSet он будет автоматически закрыт при вызове метода Statement.close(). Вы можете вызвать метод ResultSet.close (), если хотите явно закрыть объект ResultSet (Читать статью - 5.1.20 Закрытие объекта ResultSet) .

Посмотрите статьи - Рекомендация: закрытие и выпуск ресурсов JDBC и Улучшения в Java SE 7 и JDBC 4.1 (Текст из этой статьи - Функция: Возможность использовать оператор try-with-resources для автоматического закрытия ресурсов типа Connection, ResultSet и Statement)

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