JSF - 托管Bean中的对象列表和内存管理问题

时间:2011-02-07 14:10:21

标签: jsf-2 primefaces

我正在创建我的第一个JSF应用程序。对于这个问题,我将简化一切,尽量让我的问题尽可能清楚。

我正在创建的应用程序是一个简单的联系人存储应用程序,它允许您创建新联系人,存储地址,电话号码,工作地点等信息,以及上传与联系人关联的文件。

当应用程序加载时,将显示一个已创建的联系人列表。他们可以单击联系人的图像以打开联系人并查看存储在其中的所有信息。这就是我的问题所在。

所有这些信息都存储在 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-Snapshot

1 个答案:

答案 0 :(得分:0)

如果表很大,那么在服务器端需要大量内存,无论是否有JSF。

不要使用富脸表;使用ui:重复并为其编写自定义分页。

primefaces表优于h:dataTable或rich:datatable。

JSF 2.0为每个用户减少了50%的内存。

另外,使用@RequestScoped bean和ViewScoped;不要使用SessionScoped bean。

您还可以从面孔上下文中删除会话中的会话bean。

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

另外,如果你在页面中有一些商店ID而你认为你不能使用RequestScoped bean,那就错了 与您的应用程序集成tomahawk myfaces,并使用t:saveState value =“#{bean.categoryId}”/&gt;

它是当前页面范围内的商店ID或对象,列表映射。