在XPages Domino Java中回收Item对象

时间:2015-09-01 19:28:49

标签: java xpages

我有一些代码:

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的孩子而被回收?或者我应该为每个项目使用单独的变量并单独回收它们。

1 个答案:

答案 0 :(得分:5)

当您回收文档时,所有文档的项目对象也会自动回收。你不需要明确地回收这些。

如果您要遍历当前文档中的大量项目,则必须手动回收项目,让我们说成千上万。因为这可能不是你不必要的。

每个请求至少有18,000个Domino对象句柄(版本8.5 - 版本9.0中甚至更多)。如果你可以接近这个数字然后回收。如果不是不担心。

<强>更新

我做了一些关于手柄和回收的实验研究。以下是我的结果:

  • 在服务器崩溃作为限制但内存中的内部对象缓存
  • 之前,没有使用多少个已使用的Domino对象(句柄)
  • Domino对象根据类型占用不同数量的缓存内存
    • 在服务器崩溃之前,可以在缓存中处理大约500,000个项目
    • 约300,000个名称超过23个字符的项目
    • 约400,000条DateTime
    • 使用session.createDateTime(Date)
    • 创建的约9,500,000个DateTime对象
    • 使用session.createDateTime(String)
    • 创建的约258,100,000个DateTime对象
  • Domino 8.5.3和9.0.1服务器显示完全相同的结果
  • 同时运行的http请求必须共享处理内存
  • http请求在请求结束时回收所有使用过的对象
  • DateTime对象如果使用session.createDateTime(Calendar)创建,则不使用对象缓存
  • 如果父文档从项目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对象句柄正在使用中。