1

問題があり、これを解決する方法についての情報が必要です。JBoss 7.1 で JSF 2.1 を使用しており、そのビューに関連するテーブルを持つビュー スコープ Bean を使用しています。そのテーブルの行として表されるオブジェクトはかなり大きいです。

これらのビューが更新されるたびに、その Bean の新しいインスタンスが作成されます。

これが起こっていることを確認するために、デモの例を作成しました:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:p="http://primefaces.org/ui">
<h:head>
</h:head>
<h:body>
        <h:outputText value="#{viewScopedBean.i}" />
</h:body>
</html> 

このテンプレートは、次のように定義された Bean にリンクされます。

@ManagedBean
@ViewScoped
public class ViewScopedBean {


    private int i = 0;

    @PostConstruct
    public void init(){
        System.out.println("Init - " + i);
    }


    @PreDestroy
    public void dest(){
        System.out.println("Destroy - " + i);
    }

    public int getI() {
        return i;
    }

    public void setI(int i) {
        this.i = i;
    }
}

ブラウザーの更新ボタンを使用するか、単にブラウザーのアドレス フィールドで Enter キーを押すだけでビューを更新するたびに、@PostConstructメソッド呼び出しが明確に表示されます。

アプリを長時間放置する@PreDestroyと、メソッドが呼び出されていないことがわかります。ヒープダンプを取得するとViewScopedBean、ビューをリロードした数と同じ数のインスタンスがあり、ヒープに残っているように見えますセッションを破棄した場合。

これは私にとって大きな問題です。なぜなら、500 人のユーザーがその大きなテーブルでビューをリロードすると、JBoss がヒープ スペースがいっぱいになるために停止するからです。

これは Bean の設計された動作@ViewScopedですか、それとも何か間違っていますか?

4

2 に答える 2

0

ViewScoped Bean は、ビューが作成されるたびに作成されます。それで、それはあります。

しかし、500 人のユーザーがこのページにアクセスすると JBoss が死んでしまうと不満を漏らします。それを防ぐために使用できる唯一のスコープはApplicationScope. しかし、それは悪い考えです。

誰もが最も狭い範囲を使用することをお勧めします。したがって、あなたの問題の解決策は別のスコープではなく、「遅延ロード」アルゴリズムだと思います。ページごとにテーブルをロードする必要があります。誰もが一度にテーブル全体を読む必要があるとは思いません。

ここでは、スコープの適切な説明を示します。 ManagedBeanScopes

Bean を破棄する場合は、requestScope を選択する必要があります。ビュースコープの Bean がセッションに格納されているためです。

于 2013-10-03T08:09:18.290 に答える