【问题标题】:When do I need to recycle?我什么时候需要回收?
【发布时间】:2015-04-06 20:36:06
【问题描述】:

我有一个 applicationScope 托管 bean,它将一系列有关一系列应用程序的信息加载到 Map 中。那么下面的方法就是bean的一部分:

public Database getAppDB() {
    Database appDB = null;
    try{
       Session s = ExtLibUtil.getCurrentSession();
       serverName = s.createName(s.getCurrentDatabase().getServer()).getCommon();
       appDB = s.getDbDirectory(serverName).openDatabaseByReplicaID(this.getAppRepID());
       return appDB;
  }catch (NotesException e){
      System.out.println(e.toString());
      return appDB;
  }

}

现在这个方法声明了两个对象(Session 和 appDB)。不确定它们是否需要在返回之前被回收,如果是这样,因为 appDB 是返回值,所以如何做到这一点。 Session 可以很容易地被回收。 现在很明显,如果我从一些 SSJS 调用此方法:

var thisDB:NotesDatabase = appProps[ssApplication].appDB;

我需要在 SSJS 中回收 thisDB。

如果我在 SSJS 中做这样的事情:

var cNames =  appProps[ssApplication].appDB.getView("vwFTSearch").getColumnNames();

我假设没有什么可回收的?

【问题讨论】:

标签: java xpages recycle


【解决方案1】:

详细答案在 Knut 粘贴的另外两个问题中。

对您的具体问题的简短回答是您不应该getAppDB() 方法中回收这些对象。

页面被提供后,会话将被自动回收。数据库对象应由此方法的调用者回收(SSJS,对于您的情况)。

【讨论】:

  • 谢谢 - 浏览我的所有代码以确保没有需要回收的悬挂物。仍然不确定我是否完全了解何时以及何时不回收,但我想我正在赶上。 :-)
【解决方案2】:

一般规则是:你销毁(回收)你创造的东西。你留下给的东西。会话和数据库是系统提供的对象(给定的),所以即使你使用不同的函数来获取它们,你也不要管它们。

对于其余部分,我找到了一个合理的做法:在创建对象的函数中,它被回收,而不是其他任何地方。你要对“创造”有点务实。例如。当你有类似的东西时:

 var custDB = getCustDB(curUser);

那么您不会将 getCustDB 视为创建者,而是该行代码并具有 recycle();在该代码所在的函数中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-21
    • 2018-02-25
    • 1970-01-01
    • 2012-09-16
    • 1970-01-01
    • 2010-10-15
    • 2019-07-17
    相关资源
    最近更新 更多