XPages:如何多次使用ViewEntryCollection时回收Domino对象?

时间:2015-04-17 08:37:57

标签: java xpages javabeans lotus-domino recycle

我试图找到一个类似的问题,但我没有成功。

在bean中,我多次循环浏览ViewEntryCollection,添加或删除条目。有人能告诉我究竟何时这些对象应该被回收?我希望能够重用整个集合,所以我不想破坏我可能仍然需要的任何对象。

我的代码:

public static int FTSearchAll(ViewEntryCollection vec, View vw, String cat, String query) throws NotesException {
    ...
    for (ViewEntry ve = nav.getFirst(); ve != null; ) {
        ViewEntry next = nav.getNext(ve);
        Document doc = ve.getDocument();
        if (doc == null)
            continue;
        try {
            Vector v = session.evaluate(query, doc);
            if (v != null && v.size() > 0 && (Double) v.elementAt(0) != 0) {
                vec.addEntry(ve, false);
            } else {
                for (ViewEntry dce = vec.getFirstEntry(); dce != null;) {
                    ViewEntry dcnext = vec.getNextEntry(dce);
                    if (dce.getNoteID().equals(ve.getNoteID())) {
                        vec.deleteEntry(dce);
                        incinerate(dce);
                        break;
                    }
                    dce = dcnext;
                }
            }
        } catch (NotesException ne) {

        } finally {
            incinerate(ve, doc);
        }
        ve= next;
    }

一如既往:谢谢!

2 个答案:

答案 0 :(得分:1)

规则很简单:当指向Notes C对象的Java对象即将进入垃圾堆时,必须调用.recycle()。 因此,您需要对循环内的所有条目执行此操作。 我的小经验法则:创建Notes Java对象的块(想想{...})必须在最后调用它的.recycle()函数。 为您节省很多麻烦

答案 1 :(得分:1)

我看到了这一点,但不完全确定我是否遗漏了某些东西或者代码保留了它的功能......:S

    for (ViewEntry ve = nav.getFirst(); ve != null; ) {         

        ViewEntry next = nav.getNext(ve);
        Document doc = ve.getDocument();

        if (doc == null) {
            incinerate(ve);             // << new
            ve = next;                  // << new
            continue;               
        }

        try {           

            Vector v = session.evaluate(query, doc);
            if (v != null && v.size() > 0 && (Double) v.elementAt(0) != 0) {
                vec.addEntry(ve, false);
            } else {
                for (ViewEntry dce = vec.getFirstEntry(); dce != null;) {

                    ViewEntry dcnext = vec.getNextEntry(dce);
                    if (dce.getNoteID().equals(ve.getNoteID())) {
                        vec.deleteEntry(dce);
                        incinerate(dce, dcnext);       // << new                    
                        break;
                    }
                    incinerate(dce);                // << new
                    dce = dcnext;

                }
            }

        } catch (NotesException ne) {

        } finally {             
            incinerate(ve, doc);                
        }

        ve = next;
    }

检查另一个实现可能会更好。

无论如何,我建议你使用OpenNTF Domino API并摆脱回收,你也会对条目进行适当的迭代: http://www.openntf.org/main.nsf/project.xsp?r=project/OpenNTF%20Domino%20API