我正在使用JSF 2.1并且在加载包含大量数据的列表时遇到问题。 数据通过JPA从数据库中获取,基本上如下所示: (只是相关部分,省略了吸气剂和制定者)
public class HostController {
private List<Host> allHosts;
@Inject
private HostService hostService;
public void beforeRenderLoadList(final ComponentSystemEvent event) {
allHosts = hostService.findAll();
}
}
此代码用于xhtml页面上的metaevent preRenderView
。
它适用于少量数据,但由于原始表包含大约6500个条目,因此会引发堆栈溢出错误。
有没有办法延迟加载此列表或解决错误?
答案 0 :(得分:0)
您可以尝试增加java堆空间:
java -Xmx(yourdesiredmemoryspace) yourprogram
答案 1 :(得分:0)
我们通常在这种情况下做的是提供分页数据。很明显,当数据量和/或用户负载很高时,必须解决这种情况。
这基本上意味着您将拥有接受from
和to
或size
参数的方法来计算从数据库中获取的记录数量:
public List<Host> getHosts(int from, int to) {
hostService.findAllIn(int from, int to);
}
例如,Query class的Query#setFirstResult
和Query#setMaxResults
可用于在您的服务中实现该功能。
视图中的分页可以通过POST <h:commandButton>
处理,也可以通过GET通过<h:link>
和<f:param>
/ <f:viewParam>
处理。粗略的例子:
<h:commandButton value="Next" action="#{bean.next}"/>
使用视图范围的bean
private int from;
private int to;
private int step;
private int page;
public String next() {
page++;
from = (page - 1) * step + 1;
to = page * step;
return null;
}
或
<h:link value="Next" outcome="viewhost">
<f:param name="page" value="#{bean.page + 1}" />
</h:link>
请注意,增加内存大小不是问题的解决方案,但实质上是其后果的延迟。
或者,您可以使用某些组件库(如Primefaces)和默认的分页功能,例如<p:dataTable>
。
答案 2 :(得分:0)
感谢您的回答!
最终通过将每个实体的FetchType设置为LAZY来解决问题!