我有一些代码:
Document doc = view.getFirstDocument();
Item item = null;
if (null != admin.getManagers())
{
doc.replaceItemValue("Managers", admin.getManagers());
item = doc.getFirstItem("Managers");
item.setNames(true);
}
else
{
doc.replaceItemValue("Managers", "");
}
// Load the workers and set them as Names fields
if (null != admin.getWorkers())
{
doc.replaceItemValue("Workers", admin.getWorkers());
item = doc.getFirstItem("Workers");
item.setNames(true);
}
else
{
doc.replaceItemValue("Workers", "");
}
在finally部分中,我回收了文档
finally
{
if(null != doc)
{
doc.recycle();
}
}
我的问题是:我应该以同样的方式回收Item
吗?还是因为它是Document
的孩子而被回收?或者我应该为每个项目使用单独的变量并单独回收它们。
答案 0 :(得分:5)
当您回收文档时,所有文档的项目对象也会自动回收。你不需要明确地回收这些。
如果您要遍历当前文档中的大量项目,则必须手动回收项目,让我们说成千上万。因为这可能不是你不必要的。
每个请求至少有18,000个Domino对象句柄(版本8.5 - 版本9.0中甚至更多)。如果你可以接近这个数字然后回收。如果不是不担心。
<强>更新强>
我做了一些关于手柄和回收的实验研究。以下是我的结果:
DateTime dateTime = item.getDateTimeValue()
实例化后被回收,则DateTime对象将被完全回收我使用XPage调用的Java代码进行实验。
这是它的一个变体:
爪哇
package de.leonso.test;
import lotus.domino.Database;
import lotus.domino.Document;
import lotus.domino.NotesException;
import com.ibm.xsp.model.domino.DominoUtils;
public class Crasher {
public static void crash() throws NotesException {
Database database = DominoUtils.getCurrentDatabase();
for (long docNumber = 1; docNumber <= 100000; docNumber++) {
Document doc = database.createDocument();
doc.replaceItemValue("Number", Long.valueOf(docNumber));
for (int itemNumber = 3; itemNumber <= 1000; itemNumber++) {
doc.replaceItemValue("Item" + itemNumber, itemNumber);
}
System.out.println(docNumber);
doc.save();
}
}
}
的XPage
<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core">
<xp:text
escape="true"
id="computedField1">
<xp:this.value><![CDATA[#{javascript:
de.leonso.test.Crasher.crash();
"finished"
}]]></xp:this.value>
</xp:text>
</xp:view>
此代码在服务器崩溃之前创建492个文档。目前,至少有492,000个Domino对象句柄正在使用中。