0

Struts2.2.1.1とHibernate3.6.2.Finalを使用しています。また、Tomcat7.0.11で実行されている接続プールにC3P0を使用しています。

Hibernateセッションが閉じられず、「hibernate.c3p0.max_size」プロパティで構成されている開いている接続の最大数をすぐに超えてしまうという問題があります。

これは、Hibernateセッションが開いているが、閉じられていないためだと思います。ServletContextに保存されているSessionFactoryからセッションを開いています。Actionクラスのfinally{}ブロックでセッションを閉じようとしましたが、org.hibernate.LazyInitializationException例外がスローされます。

調査を行ったところ、FullHibernatePluginアプローチとOpenSessioninViewアプローチが見つかりました。

これは一般的な問題だと思いますが、最も一般的に使用されている解決策の感触をつかみたいと思います。

私が気付いたもう1つのことは、FullHibernateプラグインがStruts2.0.9+から2.1.6をサポートしていることですが、私は2.2.1.1を使用しています。これが問題になるのか、それともWebサイトが新しいバージョンをリストするように更新されていないのかわからない。

どんな入力でも大歓迎です。

4

1 に答える 1

1

hibernateプラグインを使用したことはありませんが、Open SessioninViewパターンを採用することをお勧めします。あなたは間違いなくあなたのセッションを閉じたいと思っています。

これを処理する最も一般的な方法の1つは、リクエストの開始時にセッションを作成し、それをローカルスレッドに格納してから、リクエストの終了時に閉じることです。これは、Strutsインターセプターまたはサーブレットフィルターから実行できます。基本的に:

public class HibernateSessionInterceptor extends AbstractInterceptor {
    @Override
    public String intercept(final ActionInvocation invocation) throws Exception {
        try {
            // create the session and place it in the ThreadLocal
            return invocation.invoke();
        } finally {
            // close the session and remove it from the ThreadLocal
        }
    }
}

Google Guiceを使用する場合、JPAに基づく永続性プラグイン(guice-persist)があります。同じアプローチを使用しますが、サーブレットフィルターを使用します。

于 2011-05-05T20:12:39.703 に答える