Когда мне следует вызвать javax.jdo.Query.close (Object)? - PullRequest
0 голосов
/ 26 октября 2010

Я пытаюсь понять, когда мне следует вызвать Query.close (Object) или Query.closeAll ();

Из документов Я вижу, что он "закроет результат запроса" и "освободит все связанные с ним ресурсы", но что означает "закрыть"? Означает ли это, что я не могу использовать объекты, которые я получаю из запроса после того, как на них позвонил close?

Я спрашиваю, потому что я пытаюсь разделить свой код с помощью функций, таких как getUser (id), которые будут создавать запрос, извлекать пользователя и уничтожать запрос. Если мне нужно держать Query только для доступа к пользователю, то я не могу сделать это разделение.

Что произойдет, если я не вызову close на объекте? Собирается ли это как мусор? Смогу ли я получить доступ к этому объекту позже?

Пожалуйста, дайте мне знать, если я смогу как-то уточнить свой вопрос.

Ответы [ 2 ]

2 голосов
/ 27 октября 2010

Вы не можете использовать результаты запроса , так как вы их закрыли (т. Е. Объект List, полученный вами из query.execute) Вы можете получить доступ к объектам в результатах ... если вы скопировали их в свой список или сделали ссылки на них в своем коде. Невыполнение вызова может привести к утечке памяти

1 голос
/ 26 октября 2012

Когда ваш метод запроса возвращает один объект, легко просто закрыть запрос перед возвратом одного объекта.

С другой стороны, когда ваш метод запроса возвращает коллекцию, сам метод запроса не может закрыться.запрос перед возвратом результата, потому что запрос должен оставаться открытым, пока вызывающий объект выполняет итерацию результатов.

Это возлагает ответственность за закрытие запроса, который возвращает коллекцию вызывающему и может привести к утечкам, если вызывающийне пренебрегает закрытием запроса - я думал, что должен быть более безопасный путь, и он существует!

Гвидо, давний пользователь DataNucleus, создал «закрывающий» фасад коллекции с автоматическим закрытием, который обертывает коллекцию, возвращаемую JDO Query.execute.метод.Использование чрезвычайно просто: обернуть результат запроса в экземпляр объекта автозапуска коллекции:

Вместо того, чтобы возвращать набор результатов запроса, как это:

return q.execute();

просто возвращает 'автозапуск'обернутая версия этого:

return new JDOQueryResultCollection(q, q.execute());

Для вызывающей стороны это выглядит как любая другая Коллекция, но оболочка сохраняет ссылку на запрос, который создал результат коллекции, и автоматически закрывает его, когда оболочка удаляетсяGC.

Гвидо любезно разрешил нам включить его умный код автоматического закрытия в нашу библиотеку exPOJO с открытым исходным кодом.Классы автоматического закрытия полностью независимы от exPOJO и могут использоваться изолированно.Интересующие классы находятся в файле expojo_jdo * .jar, который можно загрузить из:

http://www.expojo.com/

JDOQueryResultCollection - единственный класс, используемый напрямую, но у него есть несколько поддерживающих классов.

Просто добавьте jar в свой проект и импортируйте com.sas.framework.expojo.jdo.JDOQueryResultCollection в любой файл Java, содержащий методы запросов, которые возвращают результаты в виде коллекции.

В качестве альтернативы вы можете извлечьисходные файлы из фляги и включите их в свой проект: Они:

JDOQueryResultCollection.java
Disposable.java
AutoCloseQueryIterator.java
ReadonlyIterator.java
...