在JPA中加载列表时出现Stackoverflow错误

时间:2013-04-22 10:14:11

标签: jpa stack-overflow

我正在使用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个条目,因此会引发堆栈溢出错误。

有没有办法延迟加载此列表或解决错误?

3 个答案:

答案 0 :(得分:0)

您可以尝试增加java堆空间:

java -Xmx(yourdesiredmemoryspace) yourprogram 

答案 1 :(得分:0)

我们通常在这种情况下做的是提供分页数据。很明显,当数据量和/或用户负载很高时,必须解决这种情况

这基本上意味着您将拥有接受fromtosize参数的方法来计算从数据库中获取的记录数量:

public List<Host> getHosts(int from, int to) {
    hostService.findAllIn(int from, int to);
}

例如,Query classQuery#setFirstResultQuery#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来解决问题!