我已阅读有关回收 Domino 对象的建议: What is the best way to recycle Domino objects in Java Beans
如果我有一个名为document的数据源并且在一个被多次调用的函数中存在此代码,那么最佳实践是什么:
var doc=document.getDocument(true)
并对后端文档做一些事情。
在退出该功能之前,我应该回收doc还是将我的后端文档回收到数据源?
我已阅读有关回收 Domino 对象的建议: What is the best way to recycle Domino objects in Java Beans
如果我有一个名为document的数据源并且在一个被多次调用的函数中存在此代码,那么最佳实践是什么:
var doc=document.getDocument(true)
并对后端文档做一些事情。
在退出该功能之前,我应该回收doc还是将我的后端文档回收到数据源?
这是一个很好的问题,因为这是“回收一切”原则的唯一例外之一(另外两个值得注意的例子是您永远不应该回收当前会话或数据库)。回收数据源的后端文档是个坏主意,因为 JSF 生命周期具有相同的句柄,并且您将从 Domino 下回收它。数据源为我们处理了这个问题,因此无需手动回收它。另一方面,如果您获得了特定项目的句柄(即doc.getFirstItem("someFieldName")
,或日期的项目值,您应该回收这些对象,而不是文档本身。
到目前为止,回收 Java 和 SSJS 对象至关重要的最重要场景是在视图迭代中,因为每次您前进到下一个条目或文档时,如果您跳过回收,就会泄漏句柄。在大多数其他情况下,回收仍然是可取的,但更接近于可选,因为其他操作需要很长时间才能泄漏到足以导致问题的程度。但是,如果您正在迭代一个非常大的视图,如果您忘记回收,您很容易在一次迭代中用完句柄。
然而,一个分离的想法:我很少看到获取数据源后端文档的句柄是最佳方法的情况,因此我建议重新访问您的代码以确保甚至有必要获取此句柄开始. 例如,代替document.getDocument(true).getItemValueString("someFieldName")
,只需调用document.getValue("someFieldName")
。返回的值应该是相同的,但它会更有效地运行,并且您不会接触后端文档,因此回收不是问题。而且每次访问都减少了输入,这肯定会随着时间的推移而增加。同样,代替document.getDocument(true).replaceItemValue("someFieldName", "newValue")
,替换document.setValue("someFieldName", "newValue")
。