1

私はJSF Webアプリケーションを持っています。私は JSF 2.1.9、Hibernate 4.1.4、GlassFish 3.1.2、PrimeFaces 3.4.1 を使用しています。問題は、使用されているヒープ サイズがゆっくりと増加し、2 ~ 3 日後に最大​​ヒープ サイズに達することです。次に、GlassFish を再起動する必要があります。

ヒープ ダンプ:

最初に、アプリケーション内のすべての Web ページをクリックし、使用したヒープ サイズは 100 MB でした。

ヒープダンプ前

1 ~ 2 日後、使用されるヒープ サイズは 300 MB に増加します (この間に使用された同じ Web ページ)。

ヒープダンプ後

ヒープで最も使用されているクラスのスクリーンショットを撮りました。

クラス インスタンスではchar[]、次のような SQL クエリ文字列が多すぎます。 ヒープダンプ文字

問題は一つだけではなく、ここから解決できるかもしれません。私の Web ページでは、通常、データベースからいくつかのオブジェクトを選択してレンダリングします。ここにいくつかの豆があります: 画像 (インデックスコントローラ):

@Named("indexController")  
@SessionScoped  
public class IndexController implements Serializable {  
    EntityManagerFactory emf = Persistence.createEntityManagerFactory("imagePU");  

    public List<Image> getImages() {  
        EntityManager em = emf.createEntityManager();  
        List<Image> result;  
        try {  
            EntityTransaction entr = em.getTransaction();  
            boolean committed = false;  
            entr.begin();  
            try {  
                Query query = em.createQuery("SELECT i FROM Image i ORDER BY i.imageId DESC").setMaxResults(12);  
                result = query.getResultList();  
                entr.commit();  
                committed = true;  
            } finally {  
                if (!committed) {  
                    entr.rollback();  
                }  
            }  
        } finally {  
            em.close();  
        }  
        return result;  
    }  
}  

タグ付き画像:

@Named("galleryBean")  
@SessionScoped  
public class GalleryBean implements Serializable {  

    EntityManagerFactory emf = Persistence.createEntityManagerFactory("imagePU");  

    public List<TaggedImage> getTaggedImages() {  
        EntityManager em = emf.createEntityManager();  
        List<TaggedImage> result;  
        try {  
            EntityTransaction entr = em.getTransaction();  
            boolean committed = false;  
            entr.begin();  
            try {  
                Query query = em.createQuery("SELECT ti FROM TaggedImage ti GROUP BY ti.tag ORDER BY ti.taggedImagesId DESC");  
                result = query.getResultList();  
                entr.commit();  
                committed = true;  
            } finally {  
                if (!committed) {  
                    entr.rollback();  
                }  
            }  
        } finally {  
            em.close();  
        }  
        return result;  
    }  
}  

ちなみに、ゲッターでビジネスロジックを実行するべきではありませんが、それが私の問題の主な理由ではないと思います。助けとアドバイスが必要です。必要に応じて、さらに情報を提供できます。

ご協力いただきありがとうございます。

4

2 に答える 2

0

これで問題が解決するかどうかはわかりませんが、セッション スコープ バッキング Bean を使用しており、上記のスニペットに基づいて、実際にはリクエスト スコープ Bean である可能性があります。jsf はバッキング Bean を複数回呼び出すことで悪名高いため、使用可能な場合はおそらくビュー スコープを使用して Bean を再構築し、データベースに対して複数の呼び出しを行う必要がないようにすることも検討します。

@Named("galleryBean")  
@RequestScoped  // or @ViewScoped
public class GalleryBean implements Serializable {  

    EntityManagerFactory emf = Persistence.createEntityManagerFactory("imagePU");  

    private List<TaggedImage> images = null;

    public List<TaggedImage> getTaggedImages() {  
        if (this.images != null) {
            return this.images;
        }
        EntityManager em = emf.createEntityManager();  
        try {  
            EntityTransaction entr = em.getTransaction();  
            boolean committed = false;  
            entr.begin();  
            try {  
                Query query = em.createQuery("SELECT ti FROM TaggedImage ti GROUP BY ti.tag ORDER BY ti.taggedImagesId DESC");  
                images = query.getResultList();  
                entr.commit();  
                committed = true;  
            } finally {  
                if (!committed) {  
                    entr.rollback();  
                }  
            }  
        } finally {  
            em.close();  
        }  
        return images;  
    }  
}  

TaggedImage の実​​際のフェッチをデータベースから分離し、@PostConstruct または @URLAction を使用して Bean 構築フェーズの一部として呼び出される場所に配置すると、きれいな顔を使用して getTaggedImages() が実際に別の getter/ になります。セッター

于 2013-09-22T14:28:15.573 に答える
0

私はかつてJSFページで同様の問題を抱えていましたが、多くの調査の結果、問題はJSFがセッションで保持していたビューの数であることが判明しました。これがあなたのケースの問題かどうかはわかりませんが、これを見てビューの数を設定してください。お役に立てれば。

于 2013-09-22T14:01:45.147 に答える