當您的查詢方法返回單個對象時,只需在返回單個對象之前簡單地關閉該查詢即可。
在另一方面,當你的查詢方法返回一個集合的查詢方法本身,因爲查詢需要,同時主叫方通過迭代結果揭開留在返回結果之前不能關閉查詢。
這使責任關閉該呼叫者返回一個集合,如果來電者忽略關閉查詢可以引入泄漏查詢 - 我認爲必須有一個更安全的方式有!
圭多,時間長了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文件中。
或者你可以在你的項目中提取的jar源文件,並將它們包括:它們是:
JDOQueryResultCollection.java
Disposable.java
AutoCloseQueryIterator.java
ReadonlyIterator.java