2015-09-01 22 views
3

我有一些代碼:XPages中的Domino的Java回收項目對象

Document doc = view.getFirstDocument(); 
Item item = null; 

if (null != admin.getManagers()) 
{ 
    doc.replaceItemValue("Managers", admin.getManagers()); 
    item = doc.getFirstItem("Managers"); 
    item.setNames(true); 
} 
else 
{ 
    doc.replaceItemValue("Managers", ""); 
} 

// Load the workers and set them as Names fields 
if (null != admin.getWorkers()) 
{ 
    doc.replaceItemValue("Workers", admin.getWorkers()); 
    item = doc.getFirstItem("Workers"); 
    item.setNames(true); 
} 
else 
{ 
    doc.replaceItemValue("Workers", ""); 
} 
在最後一節

,我回收文件

finally 
{ 
    if(null != doc) 
    { 
     doc.recycle(); 
    } 
} 

我的問題是:我應該在同一個回收Item辦法?還是因爲它是Document的孩子而被回收?或者我應該爲每個項目使用單獨的變量並分別回收它們。

回答

5

當您回收文檔時,所有文檔的項目對象也會自動回收。你不需要明確地回收這些。

如果您需要通過當前文檔中的很多項目進行迭代,比如數千個項目,您將不得不手動回收項目。因爲這可能不是你不需要的情況。

對於每個請求,至少有18,000個Domino對象句柄(版本8.5 - 甚至更高版本9.0)。如果你可以接近這個數字,然後回收。如果不是不用擔心。

更新

我做了關於處理和回收利用一些實驗研究。下面是我的結果:

  • 沒有數使用Domino對象(句柄)的無服務器之前回收墜毀限位但在內存中的內部對象緩存
  • Domino對象佔用不同數量的高速緩存內存根據類型
    • 50萬的項目可以在緩存服務器與一個名字崩潰
    • 約300,000項前長於23字符處理
    • 約400,000物品DateTime類型
    • 約9500000與session.createDateTime(日期)創建日期時間對象與session.createDateTime(字符串)創建
    • 約258100000 datetime對象
  • 多米諾8.5.3和9.0。 1個服務器準確顯示了同樣的結果
  • HTTP請求在同一時間運行得份額處理內存
  • HTTP請求的請求,結束回收所有使用的對象
  • datetime對象不使用對象緩存,如果它們與session.createDateTime(日曆)
  • datetime對象得到回收完全當父文檔得到回收,如果他們得到了來自項目DateTime dateTime = item.getDateTimeValue()

我使用的Java創建實例由XPage調用的代碼用於我的實驗。

這是它的一個變化:

的Java

package de.leonso.test; 
import lotus.domino.Database; 
import lotus.domino.Document; 
import lotus.domino.NotesException; 
import com.ibm.xsp.model.domino.DominoUtils; 

public class Crasher { 
    public static void crash() throws NotesException { 
     Database database = DominoUtils.getCurrentDatabase(); 
     for (long docNumber = 1; docNumber <= 100000; docNumber++) { 
      Document doc = database.createDocument(); 
      doc.replaceItemValue("Number", Long.valueOf(docNumber)); 
      for (int itemNumber = 3; itemNumber <= 1000; itemNumber++) { 
       doc.replaceItemValue("Item" + itemNumber, itemNumber); 
      } 
      System.out.println(docNumber); 
      doc.save(); 
     } 
    } 
} 

的XPage

<?xml version="1.0" encoding="UTF-8"?> 
<xp:view xmlns:xp="http://www.ibm.com/xsp/core"> 
    <xp:text 
     escape="true" 
     id="computedField1"> 
     <xp:this.value><![CDATA[#{javascript: 
      de.leonso.test.Crasher.crash(); 
      "finished" 
     }]]></xp:this.value> 
    </xp:text> 
</xp:view> 

此代碼創建服務器崩潰前492個文件。此時至少有492,000個Domino對象處理正在使用中。

+0

除了Knut的答案之外,如果您從文檔中獲得任何NotesDateTime對象,那麼這些對象不會與文檔一起回收,因爲它們是NotesSession的子項而非Doc。如果迭代NotesViewEntries,則是相同的概念。所以NotesDateTime需要有意識地回收。否則他們將開始填寫您的處理配額(但它們將在請求結束時與會話一起回收) –

+0

請您爲每個請求語句備份18k句柄嗎?我知道整個服務器的C API的10k內部限制,而不是請求。因此,大量使用HTTP(比方說100個活動線程)可能會在一個循環中只有100個句柄而無需回收。 –

+0

@Cameron:在我的測試中我找不到證據表明DateTime值會造成特殊的回收麻煩。我還沒有測試ViewEntries。 –