0

私は JSF と spring を使用しています。セッションスコープにSpringマネージドBeanがあります。サービスコールから非常に大きなリストを取得しています。サービスを呼び出して、jsf ビューにバインドされているゲッターでリストを取得しています。アプリを実行すると、ゲッターが複数回呼び出されます。

そのため、リストが返される前に再度呼び出されてタイムアウトになります。

リストは動的です。ページの読み込み時に新しいリストを取得する必要があり、リストは 1 分ごとに richfaces a4j poll を使用して更新されます。リストはデータベースから毎回取得する必要があります。

Bean をリクエスト スコープに変更し、サービス コールをコンストラクタに移動すると、パフォーマンスが低下します。

誰もこれを行うためのより良いアーキテクチャを提案できますか?

4

1 に答える 1

1

JSFマネージドBeanゲッターは絶対にサービスを呼び出さないでください。管理対象のBeanプロパティを返すだけです。このプロパティは、(ポスト)コンストラクターまたは(アクション)リスナーメソッドによって既に準備されている必要があります。これらのメソッドは1回だけ呼び出されます。JSFが値にアクセスする必要があるため、ゲッターは複数回呼び出されます。

初めてのジョブがマネージドBeanの(ポスト)コンストラクターで実行され<a4j:poll>、リストを更新するリスナーメソッドが呼び出され、ゲッターがプロパティを返す以外に何もしないように、コードを書き直す必要があります。 。

これは、標準のJavaEE6アーティファクトを使用した基本的なキックオフの例です。私はSpringをしませんが、Springアーティファクトでこれを置き換えることができるはずです。

@ManagedBean
@SessionScoped
public class Bean {

    private List<Entity> entities;

    @EJB
    private EntityService service;

    @PostConstruct
    public void load() {
        entities = service.list();
    }

    public List<Entity> getEntities() {
        return entities;
    }

}

<a4j:poll action="#{bean.load}" interval="60000" render="someTableId" />

参照:


具体的な問題とは関係ありません。かなり大きなDBテーブル(> 1000行)がある場合、DBテーブル全体をJavaのメモリにコピーすることはかなり悪い考えです。ページ付け/フィルタリングを実装します。

于 2012-04-10T13:00:24.497 に答える