在XPages Domino Java中回收项目对象

在XPages Domino Java中回收项目对象,java,xpages,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.repla

我有一些代码:

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();
    }
}

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

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

如果要遍历当前文档中的许多项(比如数千项),就必须手动回收这些项。因为情况可能不是这样,你不必这么做

每个请求至少有18000个Domino对象句柄(在版本8.5中,甚至在版本9.0中)。如果你能接近这个数字,那么回收。如果没有,别担心

更新

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

  • 在服务器崩溃之前,没有循环使用的Domino对象(句柄)数量是有限的,但内存中有一个内部对象缓存
  • Domino对象根据类型占用不同数量的缓存内存
    • 在服务器崩溃之前,缓存中可以处理大约500000个项目
    • 大约300000个名称长度超过23个字符的项目
    • DateTime类型的大约400000项
    • 使用session.createDateTime(日期)创建的大约9500000个DateTime对象
    • 使用session.createDateTime(字符串)创建的大约2581000个DateTime对象
  • Domino8.5.3和9.0.1服务器显示的结果完全相同
  • 同时运行的http请求必须共享处理内存
  • http请求在请求端回收所有使用过的对象
  • 如果使用session.createDateTime(日历)创建DateTime对象,则不会使用对象缓存
  • 当父文档从item
    DateTime DateTime=item.getDateTimeValue()中实例化时,DateTime对象将在回收时完全回收。
我在实验中使用了XPage调用的Java代码

这是它的一个变体:

爪哇

package de.leonso.test;
导入lotus.domino.Database;
导入lotus.domino.Document;
导入lotus.domino.NotesException;
导入com.ibm.xsp.model.domino.dominutils;
公务舱破坏者{
public static void crash()引发NotesException{
Database Database=dominutils.getCurrentDatabase();
对于(长docNumber=1;docNumber

这段代码在服务器崩溃之前创建了492个文档。此时至少有492000个Domino对象句柄正在使用。

除了Knut的回答之外,如果您从文档中获得了任何NotesDateTime对象,则这些对象不会随文档一起回收,因为它们是NotesSession的子对象,而不是文档。如果迭代NotesViewEntries,则是相同的概念。因此NotesDateTime需要有意回收。否则它们将开始填满您的句柄配额(但它们将在请求结束时与会话一起回收)请,您能备份每个请求语句的18k句柄吗?我知道整个服务器的C API内部限制为10k,而不是请求。因此HTTP的使用量很大(比如说100个活动线程)“一个循环中只有100个句柄可能会导致服务器停机,而不进行回收。@Cameron:我在测试中没有发现DateTime值会给回收带来特殊麻烦的证据。我还没有测试ViewEntries。@Frantisek:你的评论促使我做了一些测试。因此,没有18K或10K限制。限制接近500K。你对simul的看法是正确的。”即时活动HTTP请求:它们必须共享对象句柄内存。因此,每个线程的实际句柄限制可能要低得多。嗨,克努特,我不确定你的实验是如何在更新时间执行的,但你说它们不使用任何句柄内存的说法与我自己的经验或下面的文章不符。(参见第四节a和b)您是否使用setPreferJavaDates(true)?