我试图找到一个类似的问题,但我没有成功。
在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;
}
一如既往:谢谢!
答案 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