提问者:小点点

循环访问集合会导致锁定


我正在进行搜索,然后循环搜索结果。这会导致我的代码被锁定,更糟糕的是,它会锁定数据库,使其无法进一步使用。即使在浏览器关闭之后。当然,在我再次尝试我的代码之前,这种“锁定”似乎会在一段时间后被清除。我将改变我执行这项特定任务的方式,但我很好奇是什么导致了这种锁定。

     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();

共3个答案

匿名用户

以下行...

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

...返回 void,您的变量项未定义。与此的下一个操作

item.appendToTextList(doc.getNoteID());

抛出一个错误,并最终始终在您的捕获块中。然后,下一个文档永远不会被提取,你有一个无限循环。

编辑:
replaceItemValue方法通常返回NotesItem,但不返回NotesXspDocument!

匿名用户

我不确定您的数据库中有多少文档。我看到两个潜在的问题:

1) db.search(在我看来)不推荐使用,因为它会导致性能问题。不确定这是否与您的问题有关,但我建议您不要使用db.search,而是使用其他工具,例如具有与您的查询匹配的选择公式的视图。

2) 如果数据库中有许多与查询匹配的文档,那么java代码可能会导致问题。据我所知,您不应该使用java获取超过10k个domino对象。

匿名用户

至少有两种调试方法。

在服务器上安装XPages工具箱。使用CPU探查器查看最耗时的部分。

http://www.openntf.org/internal/home.nsf/project.xsp?action=openDocument

将代码重写为 java,在服务器上启用调试,然后进行远程调试。这是一个视频,向您展示如何做到这一点:

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