PreparedStatement#close() автоматически закроет все связанные наборы результатов, но обратное неверно, поскольку операторы можно использовать повторно после закрытия их наборов результатов.
Посмотрите javadoc ResultSet#close ():
Примечание. Объект ResultSet автоматически закрывается сгенерировавшим его объектом Statement при закрытии этого объекта Statement.
А затем Statement#close()< /а>:
Примечание. Когда объект Statement закрывается, его текущий объект ResultSet, если он существует, также закрывается.
Это использование выглядит очень дрянным для меня:
ResultSet rs=conn.createStatement().executeQuery();
Если выполнить его достаточное количество раз, он приведет к утечке всех доступных курсоров, потому что курсоры связаны с Statement
, а не с ResultSet
.
Следовательно, чтобы закрыть базовый PreparedStatement
с помощью оператор try-with-resources, просто объявите его в операторе try
:
Оператор try-with-resources параметризуется переменными (известными как ресурсы), которые инициализируются перед выполнением блока try и закрываются автоматически.
Посмотрите на этот ответ от assylias, объявите PreparedStatement
, а также ResultSet
внутри оператора try
.
Поскольку вы ищете не утечку памяти, а утечку ресурсов. В конечном итоге память PreparedStatement
будет собрана, и ее память будет освобождена, поскольку на нее больше не ссылаются после выполнения вашего метода, учитывая способ его инициализации, однако ресурсы, удерживаемые Statement
, не закрываются.
person
AllTooSir
schedule
22.07.2013