-1

JSF 2.1 を使用していますが、膨大な量のデータを含むリストのロードに問題があります。データは JPA を介してデータベースからフェッチされます。基本的には次のようになります: (関連する部分のみ、ゲッターとセッターを省略)

public class HostController {

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

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

このコードはpreRenderView、xhtml ページのメタイベントで使用されます。

少量のデータに対しては機能していますが、元のテーブルには約 6500 のエントリが含まれているため、stackoverflow エラーがスローされます。

このリストを遅延ロードする方法や、エラーを回避する方法はありますか?

4

2 に答える 2

0

このような状況で私たちが通常行うことは、データのページネーションを提供することです。データ量やユーザー負荷が高い場合、この状況を実際に解決しなければならないことは明らかです。

これは基本的に、データベースから取得するレコードの数を説明するfromおよびtoまたはパラメータを受け入れるメソッドがあることを意味します。size

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

たとえば、Query#setFirstResultおよびQuery クラスQuery#setMaxResultsを使用して、サービス内でその機能を実現できます。

<h:commandButton>ビュー内のページネーションは、 POST を介して s によって、またはGET を介して<h:link>s および<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>

于 2013-04-22T11:51:50.493 に答える
0

回答ありがとうございます。

この問題は、各エンティティの FetchType を LAZY に設定することで最終的に解決されました!

于 2013-05-03T05:16:15.707 に答える