2015-02-06 212 views
1

我有一个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是返回的值。会议可以轻松回收。 现在显然如果我叫一些SSJS这种方法:

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

我需要在SSJS回收thisDB。

另外,如果我做SSJS是这样的:

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

我假设,没有什么回收?

+0

看看这里http://stackoverflow.com/a/17216904/2065611和http://stackoverflow.com/a/11160925/2065611 – 2015-02-06 16:26:30

回答

2

详细的答案在其他两个问题Knut粘贴。

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

会话将在页面送达后自动回收。数据库对象应该由这个方法的调用者回收(SSJS,你的情况)。

+0

谢谢 - 通过我所有的代码,以确保那里散步没有需要回收的悬挂物体。仍然不确定我完全了解何时何时不回收,但我认为我正在追赶。 :-) – 2015-02-06 22:18:00

0

一般规则是:你销毁(回收)你创建的东西。你离开了所给的。会话和数据库是系统提供的对象(给定),所以即使您使用不同的函数来获取它们,也可以让它们保持独立。

对于剩下的我找到了一个合理的做法:在创建对象的函数中,它被回收,而不是其他地方。你必须把这个“创造”看成一个小实用的东西。例如。当你有这样的:

var custDB = getCustDB(curUser); 

那么你就不会考虑getCustDB作为创造者,但该行代码,并有循环();在代码所在的函数中。

相关问题