我正在编写一个服务器任务加载项,并试图制作一个干净、可回收的代码。我正在遍历一组数据库,然后遍历数据库中的一些文档。
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`
我仍然很难过。