4

データベースのバックエンドとして Hibernate + jersey Rest And Mysql を使用しています。Hibernate では、接続に cp3 プールを使用していましたが、しばらくするとアイドル状態の接続が多数作成され、スタックしてしまいます。私の構成は次のとおりです。

ここに画像の説明を入力 ここに画像の説明を入力

package com.appname.hibernate.util;
import org.hibernate.HibernateException;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateUtil {
private static SessionFactory sessionFactory;

static {
    try {
        Configuration configuration = new Configuration().configure();

        sessionFactory = configuration.buildSessionFactory();
    } catch (HibernateException he) {
        System.err.println("Error creating Session: " + he);
        he.printStackTrace();
        throw new ExceptionInInitializerError(he);
    }
}

public static SessionFactory getSessionFactory() {
    return sessionFactory;
}
}
////////////////////// INSIDE DAO ///////////////////////////

private Session getSession() {

SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
Session session;
try {
    session = sessionFactory.getCurrentSession();
} catch (org.hibernate.HibernateException he) {
    session = sessionFactory.openSession();
}
return session;
}

public Users regsiterUser(Users users) throws Exception {

Session session = null;

try {
session = getSession();
Transaction transaction = session.beginTransaction();
session.saveOrUpdate(users);
transaction.commit();
return users;

//Using context session that is why I am not closing session
} catch (Exception e) { throw e; }
}

このDAO関数をコントローラーから呼び出しており、DAOレイヤー内でトランザクションとセッションを作成しています。私はこれを解決しようとしていますが、解決策が得られません。上記の構成とコードの何が問題なのかを見てください......

前もって感謝します.....

4

1 に答える 1

1

session = sessionFactory.openSession();これは、使用後にリソースを解放するオーケストレータによって管理されていないため、使用後に手動で閉じる必要があると思います。

于 2013-09-02T06:12:52.200 に答える