所以我有一个问题,我需要任何有关如何解决这个问题的信息.我们在JBoss 7.1上使用JSF 2.1,我们正在使用具有与该视图相关的表的视图范围bean.在该表中表示为行的对象非常大.
在每次刷新这些视图时,都会创建该bean的新实例.
为了验证这是否发生,我创建了一个演示示例:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:p="http://primefaces.org/ui">
<h:head>
</h:head>
<h:body>
<h:outputText value="#{viewScopedBean.i}" />
</h:body>
</html>
Run Code Online (Sandbox Code Playgroud)
然后将此模板链接到如下定义的bean:
@ManagedBean
@ViewScoped
public class ViewScopedBean {
private int i = 0;
@PostConstruct
public void init(){
System.out.println("Init - " + i);
}
@PreDestroy
public void dest(){
System.out.println("Destroy - " + i);
}
public int getI() {
return i;
}
public void setI(int i) {
this.i = i;
}
}
Run Code Online (Sandbox Code Playgroud)
每次我使用浏览器刷新按钮刷新视图或只需在浏览器地址字段中按Enter键,我就会清楚地看到@PostConstruct方法调用.
如果我让应用程序保持活动很长时间,我看不到任何@PreDestroy方法被调用,并且进行堆转储显示我ViewScopedBean的实例数与我重新加载视图的数量相同,并且看起来仍然在堆上如果我摧毁会话
这对我来说是一个很大的问题,因为如果有500个用户使用那个大表重新加载视图,JBoss会因为它的堆空间已满而死掉.
这是@ViewScoped豆的设计行为还是我做错了什么?
只要用户通过将回发返回到同一视图(通过返回null/ void从UICommand操作方法)与当前视图交互,就可以查看范围内的bean .从操作方法返回当前视图ID,将get请求发送到同一视图,刷新页面,在浏览器的地址栏中手动输入URL以及这些事件都会导致重新创建视图.因此,您会看到在每个此类操作上重新实例化视图范围的bean.
| 归档时间: |
|
| 查看次数: |
7898 次 |
| 最近记录: |