2015-02-06 214 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作爲創造者,但該行代碼,並有循環();在代碼所在的函數中。

相關問題