2010-10-26 162 views
0

我想了解何時應該調用Query.close(Object)或Query.closeAll();什麼時候應該調用javax.jdo.Query.close(Object)?

the docs我看到它就會「關閉查詢結果」和「釋放與其相關的所有資源,」但什麼是「親密」是什麼意思?這是否意味着我不能使用在我關閉它們之後從Query中獲得的對象?

我問,因爲我想我的劃分與喜歡的getUser(ID)功能,這將創建一個查詢,獲取用戶,並摧毀了查詢代碼。如果我必須圍繞查詢訪問用戶,那麼我無法真正實現這種劃分。

如果我不關閉對象,會發生什麼?它會被收集爲垃圾嗎?我能稍後訪問該對象嗎?

請讓我知道,如果我可以進一步指定我的問題。

回答

2

自從關閉它們(即從query.execute返回的List對象)後,您無法使用查詢結果。您可以在結果中訪問對象 ...如果您將它們複製到您自己的列表中,或者在您的代碼中對它們進行了引用。未能致電關閉可能會泄漏內存

1

當您的查詢方法返回單個對象時,只需在返回單個對象之前簡單地關閉該查詢即可。

在另一方面,當你的查詢方法返回一個集合的查詢方法本身,因爲查詢需要,同時主叫方通過迭代結果揭開留在返回結果之前不能關閉查詢。

這使責任關閉該呼叫者返回一個集合,如果來電者忽略關閉查詢可以引入泄漏查詢 - 我認爲必須有一個更安全的方式有!

圭多,時間長了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 
相關問題