2013-06-20 29 views
9

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

什么是最好的做法,如果我有一个数据源命名文件并在函数被调用几次验证码存在:

var doc=document.getDocument(true) 

并在后端文件中做东西。

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

+0

关于回收的理由是释放使用的物体。它在http线程完成请求时自动发生。重要的是循环循环,消耗更多的有限数量的对象(整个Domino服务器/ Notes客户端的限制为10K句柄)。所以,除非循环调用您的代码,否则您可以承担不回收少量文档的责任。注意与会话绑定的特殊对象(日期/时间,用户)。 –

回答

13

这是一个很好的问题,因为这是唯一的例外“回收一切”的原则之一(另外两个显着的例子是,你应该从未回收当前会话或数据库)。回收数据源的后端文档是一个坏主意,因为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")