在XPages Domino Java中回收Item对象

Rob*_*son 3 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", "");
}
Run Code Online (Sandbox Code Playgroud)

在最后一节中,我回收了文档

finally 
{
    if(null != doc)
    {
        doc.recycle();
    }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是:我应该Item以同样的方式回收吗?或者它是否被回收,因为它是一个孩子Document?或者我应该为每个项目使用单独的变量并单独回收它们.

Knu*_*ann 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请求在请求结束时回收所有使用的对象
  • 如果使用session.createDateTime(Calendar)创建它们,则DateTime对象不使用对象缓存
  • 当父文档从项目实例化时,DateTime对象将被完全回收 DateTime dateTime = item.getDateTimeValue()

我使用XPage调用的Java代码进行实验.

这是它的一个变种:

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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

的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>
Run Code Online (Sandbox Code Playgroud)

此代码在服务器崩溃之前创建492个文档.目前,至少有492,000个Domino对象句柄正在使用中.