【问题标题】:XPage Java Object Recycle in SSJSSSJS 中的 XPage Java 对象回收
【发布时间】:2013-06-20 12:54:34
【问题描述】:

我已阅读有关回收 Domino 对象的建议: What is the best way to recycle Domino objects in Java Beans

如果我有一个名为 document 的数据源并且在一个被多次调用的函数中存在此代码,那么最佳做法是:

var doc=document.getDocument(true)

并对后端文档进行处理。

在我退出函数之前,我应该回收 doc 还是回收到数据源的后端文档?

【问题讨论】:

  • 回收的基本原理是释放使用过的物品。当 http 线程完成请求时,它会自动发生。本质是循环回收,消耗更多有限数量的对象(整个 Domino 服务器/Notes 客户端的限制是 ~10k 句柄)。因此,除非您循环调用您的代码,否则您可以不回收很少的文档。当心与会话相关的特殊对象(日期/时间、用户)。

标签: xpages xpages-ssjs


【解决方案1】:

这是一个很好的问题,因为这是“回收一切”原则的唯一例外之一(另外两个值得注意的例子是你应该永远回收当前会话或数据库)。回收数据源的后端文档是个坏主意,因为 JSF 生命周期具有相同的句柄,并且您将从 Domino 下回收它。数据源为我们处理了这个问题,因此无需手动回收它。另一方面,如果您获得了特定项目的句柄(即doc.getFirstItem("someFieldName"),或作为日期的项目值,您应该回收这些对象,而不是文档本身。

到目前为止,回收 Java 和 SSJS 对象至关重要的最重要场景是视图迭代,因为每次您前进到下一个条目或文档时,如果您跳过回收,就会泄漏句柄。在大多数其他情况下,回收仍然是可取的,但更接近于可选,因为其他操作需要很长时间才能泄漏到足以导致问题的程度。但是,如果您正在迭代一个非常大的视图,如果您忘记回收,您很容易在一次迭代中用完句柄。

然而,一个分离的想法:我很少看到获取数据源后端文档的句柄是最佳方法的情况,因此我建议重新访问您的代码以确保甚至有必要获取此句柄首先。例如,不用document.getDocument(true).getItemValueString("someFieldName"),只需调用document.getValue("someFieldName")。返回的值应该是相同的,但它会更有效地运行,并且您不会接触后端文档,因此回收不是问题。而且每次访问都减少了输入,这肯定会随着时间的推移而增加。同样,用document.setValue("someFieldName", "newValue")代替document.getDocument(true).replaceItemValue("someFieldName", "newValue")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-23
    • 1970-01-01
    • 1970-01-01
    • 2019-05-02
    • 2017-06-20
    相关资源
    最近更新 更多