0

Web アプリケーションがフリーズするという問題が発生しています。JConsole 監視ツールを使用すると、アプリが maxPoolSize に達していることがわかります。これにより、アプリがフリーズします。

システムには約 20 人のユーザーがいて、各ユーザーは複数の Web セッションを持つことができます。

アプリ内の HttpServlet の例を次に示します。

public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
    Session sess = null;
    Transaction tx = null;
    try {
        sess = RuntimeContext.getCurrentSession();
        tx = sess.beginTransaction();
        doingStuffWithSession(req, res, sess);
        if (!tx.wasCommitted()) {
            tx.commit();
        }
    } catch (Exception e) {
        handleException(e, req, sess);
    } finally {
        if (sess != null && sess.isOpen() && tx != null && tx.isActive()) {
              tx.rollback();
        }
    }
}

c3p0 の休止状態のプロパティは次のとおりです。

<properties>
    <property name="hibernate.dialect" value="org.hibernate.dialect.SQLServerDialect"/>
    <property name="hibernate.archive.autodetection" value="class, hbm"/>
    <property name="hibernate.c3p0.min_size" value="20" />
    <property name="hibernate.c3p0.max_size" value="200" />
    <property name="hibernate.c3p0.timeout" value="300" />
    <property name="hibernate.c3p0.max_statements" value="50" />
    <property name="hibernate.c3p0.idle_test_period" value="3000" />
</properties>
4

1 に答える 1

1

使用するたびにセッションを開いたり閉じたりするのではなく、(RuntimeContextで)セッションを開いたままにしているように見えます。セッションは接続をラップします。セッションを閉じないと、プールが使い果たされてしまいます。トランザクションをコミットまたはロールバックするだけでは不十分です。

クライアントごとに新しいセッションを開き、クライアントが終了したらすぐに閉じる必要があります。たとえば、ここに示されているイディオムを参照してください:http ://www.tutorialspoint.com/hibernate/hibernate_sessions.htm

于 2013-03-12T20:37:48.097 に答える