我是否必须在重复功能中使用回收Notes对象?

时间:2016-03-02 04:54:24

标签: xpages xpages-ssjs

我有一个递归函数,它使用Notes对象。请告诉我是否应该为这些对象调用recycle方法,或者我可以将它留给垃圾收集器?

function getAllUsersInDepartmentAndSub (nd: NotesDocument, arrData: Array) {
  var strSubPrefix = strTaskLibName + "getAllUsersInDepartmentAndSub/";
  try {
    var ndcResp: NotesDocumentCollection;
    var ndResp: NotesDocument;
    var ndNext: NotesDocument;
    var strTemp: string;

    if (nd) {
        ndcResp = nd.getResponses();
        if (ndcResp) {
            if (ndcResp.getCount() > 0) {
                ndResp = ndcResp.getFirstDocument();
                while (ndResp) {
                    strTemp = @LowerCase(ndResp.getItemValueString("form")); 
                    if (strTemp == "department") {
                        getAllUsersInDepartmentAndSub (ndResp, arrData);
                    } else if (strTemp == "person") {
                        strTemp = ndResp.getItemValueString("fullname");
                        if (@Member(strTemp, arrData) <= 0) {
                            arrData.push(strTemp);                          
                        }
                    }
                    ndNext = ndcResp.getNextDocument(ndResp);
                    ndResp.recycle();
                    ndResp = ndNext;
                }
            }
            ndcResp.recycle();
        }
    }
  } catch(e) {
    writeInfo(strSubPrefix, e, true, true);
  }
}

1 个答案:

答案 0 :(得分:4)

简而言之:回收再循环,回收!

您必须在不再需要时立即回收所有Domino对象。 而且你必须要小心:如果你错过了一个实例,那么在你的代码中发现回收问题是非常可怕的。

在上面的代码中,当抛出错误时,NotesDocumentCollection ndcResp 不会被回收,并且您的服务器迟早会遇到分配问题。

您应该使用 finally 语句并回收函数中使用的所有对象,这样即使方法中的某些内容出错,它们也会被清理。