0

我正在编写一个服务器任务加载项,并试图制作一个干净、可回收的代码。我正在遍历一组数据库,然后遍历数据库中的一些文档。

    for (String serverAndFilename : listofServerFilenames) {
        String[] parts = serverAndFilename.split("!!");
        currentGECDB = session.getDatabase(parts[0], parts[1]);
        if (currentGECDB.isOpen()) {
        collSourceDocuments = currentGECDB.search(this
            .getSearchFormula(this
                .getvariablePartOfSearchFormula()));
        countOfSearchDocuments = collSourceDocuments.getCount();    
            docToChange = collSourceDocuments
                .getFirstDocument();
            while (docToChange != null) {
            if (changeNamesFieldsOnThisDocument(docToChange)) {
//                .... other code here
            } 
            tmpdoc = collSourceDocuments.getNextDocument();
            docToChange.recycle();
            docToChange = tmpdoc;
            }
        }
        }
    }

我担心使用繁重的 Notes 对象作为 Java 函数的参数时的内存管理问题。在检查我的函数所做的更改时,我得到了“旧”值,并且需要在重新检索文档之前对我的文档进行 recycle()。

在我看来,我被迫只将原语作为参数传递给外部函数,即

public booleanfunction (String ServerName, String ReplicaIDOfDatabase, String UNIDofDocument)

但这意味着许多后续的 OpenDatabase 调用,这些调用很昂贵。

有没有最好的方法来做到这一点?

例如,这是我对结果进行的 JUnit 测试的一部分:

public void testNewArrivalTaskExample() {
try {
    testNewArrivalTask = GECTaskNewArrival.getTestTask(db, oli);
    testNewArrivalTask.save();

    Document testdocNewArrival_1 = getNewTestSourceCourrierDocument();
    for (NamesItemsInProcedure n : NamesItemsInProcedure.values()) {
    setNamesField(testdocNewArrival_1, n,
        GECTaskNewArrival.NEW_ARRIVAL_ROLE_MODEL,
        NamesItemsInProcedure.NOUVELLE_ARRIVEE);
    }

    testdocNewArrival_1.replaceItemValue("TestDocumentDescription",
        "NewArrival_AllFields");
    testdocNewArrival_1.save();

    GECTaskNewArrival gna = new GECTaskNewArrival(testNewArrivalTask,
        db, oli);

    gna.process();

    Item itemsuivi = testdocNewArrival_1
        .getFirstItem(NamesItemsInProcedure.SUIVI_COURRIER
            .getItemName());

    System.out.println("Content of document without recycle + rebirth:");
    printItemValuesToSysout(itemsuivi);

    System.out.println(NamesItemsInProcedure.SUIVI_COURRIER
        .getItemName()
        + " Should contain "
        + GECTaskNewArrival.NEW_ARRIVAL_NEWPERSON);

    String noteID = testdocNewArrival_1.getNoteID();
    testdocNewArrival_1.recycle();

    for (NamesItemsInProcedure n : NamesItemsInProcedure.values()) {
    boolean result = itemContainsThisForTestDoc(GECAlladin, noteID,
        n.getItemName(),
        GECTaskNewArrival.NEW_ARRIVAL_NEWPERSON);
    switch (n) {
    case ENCOURS_COURRIER:
        assertTrue(result);
        break;
    case AUTEURS_COURRIER:
        assertTrue(result);
        break;
    case SUIVI_COURRIER:
        assertTrue(result);
        break;
    case ECHEANCEMESSAGENOM_COURRIER:
        assertTrue(result);
        break;
    default:
        // assertFalse(result);
        break;

    }
    }

} catch (NotesException e) {
    e.printStackTrace();
}
}

这是控制台结果:

Content of document without recycle + rebirth:

Suivi has these values:
Donald VieuxDeLaVieille/dsic/ville-ge`
the item belongs to this document 929E`
Suivi Should contain CN=Micky NouvelleArrivee/OU=salut/OU=Truc/O=Muche`

Suivi has these values:`
Donald VieuxDeLaVieille/dsic/ville-ge`
CN=Micky NouvelleArrivee/OU=salut/OU=Truc/O=Muche`
the item belongs to this document 929E`
Suivi contains CN=Micky NouvelleArrivee/OU=salut/OU=Truc/O=Muche`

我仍然很难过。

4

1 回答 1

1

您可以尝试从此更改您的代码:

tmpdoc = collSourceDocuments.getNextDocument();

对此:

tmpdoc = collSourceDocuments.getNextDocument(docToChange);

根据文档,从 getNextDocument 调用中省略 Document 参数应该可行,但我的理解是 DocumentCollection 内部有不同的实现,具体取决于集合的构建方式,我认为省略 Document 参数可能会给出在由 Database.search() 创建的 DocumentCollection 的情况下,您会得到一些奇怪的结果(即解释您所看到的“旧”值)。

于 2013-05-30T16:27:27.330 回答