繁体   English   中英

在XPages Domino Java中回收Item对象

[英]Recycling Item objects in XPages Domino Java

我有一些代码:

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 
{
    if(null != doc)
    {
        doc.recycle();
    }
}

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

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

如果你在当前文档中迭代很多项目,那么你必须手动回收项目,比如说成千上万。 因为这可能不是你不必要的情况。

每个请求至少有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();
        }
    }
}

的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对象句柄正在使用中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM