2011-02-07 70 views
1

我正在創建我的第一個JSF應用程序。對於這個問題,我將簡化所有的事情,儘量讓我的問題儘可能清楚。JSF - 託管Bean和內存管理問題中的對象列表

我創建的應用程序是一個簡單的聯繫人存儲的應用程序,將允許您創建新的聯繫人,存儲信息,如地址,電話號碼,他們在哪裏工作,並上傳相關聯的聯繫人文件。

當應用程序加載用戶顯示與已創建的聯繫人列表。他們可以點擊聯繫人的圖片打開聯繫人並查看存儲在其上的所有信息。這是我的問題進來的地方。

所有這些信息都存儲在ContactManager.java管理bean中。聯繫人上的所有數據都顯示在數據表中。所以有一個地址數據表,手機數據表,上傳數據表。每個數據表視圖駐留在適當的選項卡中。我正在使用Primefaces來創建選項卡。所以基本上當聯繫人打開時,系統必須加載大約10個數據列表以及用於選擇值的下拉列表。在選項卡中填充這些數據表。

@ManagedBean 
@ViewScoped 
public class ContactManager implements Serializable { 

    private Contact contactInfo; 
    private List<Phone> phones; 
    private List<Addresses> addresses; 
    private List<Company> jobs; 
    private List<Files> uploads; 

    //dropdown select lists 
    private List<Country> countryList; 
    private List<State> stateList; 

    //Getters and setters for everyting 
    ..... (I am not going to type it all out but its there) 


    @PostConstruct 
    public void openContact() { 
     try { 
      this.countryList = myDao.getCountryList(); 
      this.stateList = myDao.getStateList(); 
      this.addresses = myDao.getAddresses(contactInfo.contactId); 
      this.phones = myDao.getPhones(contactInfo.contactId); 
      this.jobs = myDao.getJobs(contactInfo.contactId); 
      this.uploads = myDao.getUploads(contactInfo.contactId); 
     } 
    } 
} 

當用戶打開所有這些聯繫人信息被加載到存儲器中,以便它可以在視圖中顯示的接觸所以基本上。

這個例子是小到列表中,並且我是存儲數據的實際數額,但爲了簡化起見,我想知道內存管理。

我的系統是要由多個用戶使用,並加載所有的這些信息讓我擔心。什麼時候分配給所有這些內存得到清除?我負責清理嗎?

如果我有10個用戶,他們都在查看包含大量數據的真正大表的聯繫人,我擔心這會導致一切都陷入停滯。

目前它在我的系統上運行良好,但我知道所有這些表和列表都保存在內存中,直到用戶單擊並打開新聯繫人或關閉應用程序。

上,如果這是做事情還是如何處理龐大的信息像這樣將是巨大的正道任何瞭解。

我使用JSF 2.0/Primefaces 2.2RC2快照

+0

您是否想過儘快使用`@ RequestScope`來釋放內存(在請求被提供之後)或者關於使用`@ ViewScope`使用Ajax調用以及`@ PostConstruct`方法中的特定加載以及按需加載數據(標籤切換)? – Gaim 2011-02-07 15:51:28

回答

0

如果表非常大,需要大量的內存在服務器端,有或沒有JSF。

請勿使用豐富的臉部表格;使用ui:重複併爲其編寫自定義分頁。

primefaces表比h:dataTable或rich:datatable更好。

JSF 2.0爲每個用戶使用的內存減少了50%。

此外,使用@RequestScoped豆類和ViewScoped;不要使用SessionScoped bean。

您還可以從面部上下文中的會話中刪除會話bean。

context = FacesContext.getCurrentInstance(); 
externalContext = context.getExternalContext(); 
externalContext.getSessionMap().remove("UserContext"); 
externalContext.getSessionMap().remove("SessionController"); 

等等。

此外,如果您在頁面中存儲了一些id,並且您認爲無法使用RequestScoped beans,則將錯誤 與您的應用程序tomahawk myfaces集成並使用t:saveState value =「#{bean.categoryId }「/>

它是存儲在當前頁面範圍內的id或對象列表映射。