【问题标题】:JSF - List of objects in a Managed Bean and memory management questionJSF - 托管 Bean 中的对象列表和内存管理问题
【发布时间】:2011-02-07 14:10:20
【问题描述】:

我正在创建我的第一个 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

【问题讨论】:

  • 您是否考虑过使用@RequestScope 尽快释放该内存(在处理请求之后),或者是否考虑使用带有@ViewScope 的Ajax 调用,并且只在@PostConstruct 方法中进行特定加载和其余数据按需加载(标签切换)?
  • @Gaim 我曾考虑在选项卡切换期间按需加载它,但如果用户单击所有选项卡会怎样。然后所有的数据都被加载到了成员变量中。在用户查看所有数据之前,这是一种改进。当他们点击离开选项卡并将当前选项卡的对象数据设置为 null 或其他内容时,我是否需要处理?
  • @Gaim - @RequestScope 也不适用于我的应用程序,因为我必须保留一些信息,例如 contactId 和一些用于导航的视图特定变量。

标签: jsf-2 primefaces


【解决方案1】:

如果表很大,无论有没有 JSF,您都需要在服务器端占用大量内存。

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

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

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

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

您还可以从 Faces 上下文中的会话中删除会话 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}"/>

是当前页面范围内的store id或者objects,list maps。

【讨论】:

    猜你喜欢
    • 2015-03-11
    • 2012-10-13
    • 1970-01-01
    • 2012-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-22
    • 1970-01-01
    相关资源
    最近更新 更多