Когда ваш метод запроса возвращает один объект, легко просто закрыть запрос перед возвратом одного объекта.
С другой стороны, когда ваш метод запроса возвращает коллекцию, сам метод запроса не может закрыться.запрос перед возвратом результата, потому что запрос должен оставаться открытым, пока вызывающий объект выполняет итерацию результатов.
Это возлагает ответственность за закрытие запроса, который возвращает коллекцию вызывающему и может привести к утечкам, если вызывающийне пренебрегает закрытием запроса - я думал, что должен быть более безопасный путь, и он существует!
Гвидо, давний пользователь 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