-1

我正在使用 JSF 2.1 并且在加载包含大量数据的列表时遇到问题。数据是通过 JPA 从数据库中获取的,基本上如下所示:(只是相关部分,省略了 getter 和 setter)

public class HostController {

    private List<Host> allHosts;
    @Inject
    private HostService hostService;

    public void beforeRenderLoadList(final ComponentSystemEvent event) {
        allHosts = hostService.findAll();
    }
}

此代码用于preRenderViewxhtml 页面上的元事件。

它适用于少量数据,但由于原始表包含大约 6500 个条目,因此会引发 stackoverflow 错误。

有什么方法可以延迟加载此列表或解决错误吗?

4

2 回答 2

0

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

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

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

例如,Query#setFirstResultQueryQuery#setMaxResults可用于在您的服务中实现该功能。

视图中的分页可以由<h:commandButton>s 通过 POST 或<h:link>s 和<f:param>/<f:viewParam>通过 GET 处理。粗略的例子:

<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>.

于 2013-04-22T11:51:50.493 回答
0

感谢您的回答!

通过将每个实体的 FetchType 设置为 LAZY,终于解决了这个问题!

于 2013-05-03T05:16:15.707 回答