xpages
2012-11-21 74 views 0 likes 
0

我在做一個搜索,然後循環遍歷結果。這會導致我的代碼被鎖定,甚至更糟糕,它會鎖定該數據庫以免被其他用戶使用。即使在瀏覽器關閉之後。看起來這個「鎖定」在一段時間後被清除,直到我再次嘗試我的代碼。我將改變我做這個特定任務的方式,但我很好奇究竟是什麼導致了這種鎖定。通過收集循環導致鎖定

 var collection = database.search("Form = 'Request01' & Status='Approved'"); 

if (collection.getCount() == 0) 
{ 
    getComponent("panel1").setRendered(false); 
    getComponent("panel2").setRendered(true); 
    getComponent("panel4").setRendered(true); 
    return; 
} 


dBar.info("Approved Requests Found= " + collection.getCount()); 

var item:NotesItem = document1.replaceItemValue("DocIds","AAAA"); 

var doc:NotesDocument = collection.getFirstDocument(); 

while (doc != null) 
{ 
    try 
    { 
     var tmpDoc = collection.getNextDocument(doc); 
     item.appendToTextList(doc.getNoteID()); 
     dBar.info("Processing document: " + doc.getNoteID()) 
     doc.recycle(); 
     doc = tmpDoc; 

    } 
    catch(e) 
    { 
     dBar.error(e.message); 

    } 
} 
document1.save(); 

回答

4

下面一行...

var item:NotesItem = document1.replaceItemValue("DocIds","AAAA"); 

...返回無效,你的變量項目是不確定的。與此

item.appendToTextList(doc.getNoteID()); 

接下來的操作將引發一個錯誤,並在您 - 塊總是結束。然後,下一個文件是從來沒有抓取,你有一個無限循環。

編輯
replaceItemValue方法正常返回NotesItem,而不是一個NotesXspDocument!

+0

replaceItemValue應該返回一個項目,所以我不確定這是無限循環的原因,但Sven是正確的:該嘗試應該是在循環周圍,而不是在它內部。 –

+0

@Tim:否,* NotesXspDocument *的* replaceItemValue *方法返回* void *。對於Java和LS,它將返回NotesItem。 –

+0

那麼如何獲得NotesItem的句柄?他們會這樣做嗎? –

1

我不確定數據庫中有多少個文檔。我看到兩個潛在的問題:

1) db.search是(在我看來)不建議使用,因爲它會導致性能問題。 不確定它是否與你的問題有關,而不是使用db.search我建議使用別的東西, G。選擇公式與您的查詢匹配的視圖。 2)如果你的db有很多與你的查詢相匹配的文檔,java代碼可能會導致問題。據我所知,你不應該使用java獲取超過10k個多米諾骨牌對象。

0

至少有兩種調試方法。

在服務器上安裝XPages Toolbox。使用CPU分析器查看花費最多的時間。

http://www.openntf.org/internal/home.nsf/project.xsp?action=openDocument&name=xpages%20toolbox

代碼重寫到Java,在服務器上啓用調試,以及遠程調試。 這裏將告訴您如何做到這一點的視頻:

http://www-10.lotus.com/ldd/ddwiki.nsf/dx/Debug_Java_for_XPages_in_NSFs

相關問題