2013-06-20 34 views
9

我已閱讀這個建議有關Domino的回收對象: What is the best way to recycle Domino objects in Java Beans的XPage Java對象回收

什麼是最好的做法,如果我有一個數據源命名文件並在函數被調用幾次驗證碼存在:

var doc=document.getDocument(true) 

並在後端文件中做東西。

在我退出函數之前,我應該回收doc還是我的後端文件再循環到數據源呢?

+0

關於回收的理由是釋放使用的物體。它在http線程完成請求時自動發生。重要的是循環循環,消耗更多的有限數量的對象(整個Domino服務器/ Notes客戶端的限制爲10K句柄)。所以,除非循環調用您的代碼,否則您可以承擔不回收少量文檔的責任。注意與會話綁定的特殊對象(日期/時間,用戶)。 –

回答

13

這是一個很好的問題,因爲這是唯一的例外「回收一切」的原則之一(另外兩個顯着的例子是,你應該從未回收當前會話或數據庫)。回收數據源的後端文檔是一個壞主意,因爲JSF生命週期獲得相同的句柄,並且您將從Domino下將其回收。數據源爲我們處理這個問題,因此不需要手動回收它。在另一方面,如果你得到關於具體項目的句柄(即doc.getFirstItem("someFieldName"),或項目值是日期,您應該回收這些對象,只是沒有文件本身。

到目前爲止,最重要的場景,這是回收Java和SSJS對象的關鍵在於迭代,因爲每次你進入下一個入口或文檔時,如果你跳過回收站就會漏掉一個句柄,在大多數情況下,回收仍然是可取的,但更接近於存在可選的,因爲其他操作需要很長時間才能夠泄漏導致問題,但是如果您正在迭代一個非常大的視圖,那麼如果您忘記了回收操作,則可以輕鬆地在一次迭代中耗盡控制柄。然而,一個離別的想法是:我很少看到處理數據源的後端文檔是最好的方法,所以我建議重新訪問你的代碼,以確保甚至有必要獲得這個句柄以開始。例如,而不是document.getDocument(true).getItemValueString("someFieldName"),只需致電document.getValue("someFieldName")即可。返回的值應該相同,但運行效率會更高,而且您不會觸及後端文檔,因此回收不是問題。而且每個項目的訪問次數都會減少,隨着時間的推移肯定會增加。同樣,代替document.getDocument(true).replaceItemValue("someFieldName", "newValue"),替代document.setValue("someFieldName", "newValue")