1

私はHibernate3.3でStruts2Frameworkに取り組んでおり、Oracle11gを使用しています。私のWebプロジェクトは、5か月から正常に機能していました。しかし、最近、java.sql.SQLRecoverableException:アイドル時間中に接続が閉じられました。次のシナリオについて説明します。私のhibernate.cfg.xml構成は

<property name="hibernate.current_session_context_class">
        thread
    </propert
<property name="connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property>
<property name="connection.username">user</property>
<property name="connection.password">user</property>
<property name="connection.driver_class">
        oracle.jdbc.OracleDriver
    </property>
<property name="myeclipse.connection.profile">Oracle</property>
<property name="hibernate.connection.autoReconnect">true</property>
<property name="dialect"> org.hibernate.dialect.Oracle10gDialect </property>

そして私のHibernateSessionFactoryconfは

private static String CONFIG_FILE_LOCATION = "/hibernate.cfg.xml";
private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();
private static Configuration configuration = new Configuration();
private static org.hibernate.SessionFactory sessionFactory;
private static String configFile = CONFIG_FILE_LOCATION;
static {
    try {
        configuration.configure(configFile);
        sessionFactory = configuration.buildSessionFactory();
    } catch (Exception e) {
        System.err
                .println("%%%% Error Creating SessionFactory %%%%");
        //e.printStackTrace();
    }
}
private HibernateSessionFactory() {
}
public static Session getSession() throws HibernateException {
    Session session = (Session) threadLocal.get();

    if (session == null || !session.isOpen()) {
        if (sessionFactory == null) {
            rebuildSessionFactory();
        }
        session = (sessionFactory != null) ? sessionFactory.openSession()
                : null;
        threadLocal.set(session);
    }

    return session;
}
public static void rebuildSessionFactory() {
    try {
        configuration.configure(configFile);
        sessionFactory = configuration.buildSessionFactory();
    } catch (Exception e) {
        System.err
                .println("%%%% Error Creating SessionFactory %%%%");
        //e.printStackTrace();
    }
}
public static void closeSession() throws HibernateException {
    Session session = (Session) threadLocal.get();
    threadLocal.set(null);

    if (session != null) {
        session.close();
    }
}
public static org.hibernate.SessionFactory getSessionFactory() {
    return sessionFactory;
}
public static void setConfigFile(String configFile) {
    HibernateSessionFactory.configFile = configFile;
    sessionFactory = null;
}
public static Configuration getConfiguration() {
    return configuration;
}

次に、次のコードを実行するとエラーが発生します

session = HibernateSessionFactory.getSession();
Query query = session.createQuery(SQL_QUERY);
try {
                // session.connection().close();
                System.out.println("CLOSED :"
                        + session.connection().isClosed());
                if (session.connection().isClosed()) {
                    System.out.println("RECONNECTING.......");
                    session.reconnect();
                }
                System.out.println("CLOSED :"
                        + session.connection().isClosed());
            } catch (Exception e1) {

                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
try {
for (Iterator it = query.iterate(); it.hasNext();) {
                    chk = true;
                    ur = (EmagEnterpriseLogin) it.next();
} catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

セッションが開いてクエリが正常に作成されたにもかかわらず上記のスニペットが実行された場合、クエリの反復に失敗します。初めて来る

Caused By:java.sql.SQLRecoverableException: Closed Connection

しかし、最初の試行でこのエラーが発生する前に、セッションをキャプチャしました。Connection.isClosed()はfalseでした。しかし、最初のエラーの後、SQL State = nullとして発生し続け、2回目からsession.Connection.isClosed()がtrueになりました。その後、再接続が実行されますが、それでも同じエラーが繰り返されます。sessionfactoryの再構築も試みましたが、失敗しました。この問題を解決するのを手伝ってください。

4

1 に答える 1

2

最後に、私の問題の解決策は、Hibernateネイティブ接続プロバイダーを使用する代わりにサードパーティの接続プロバイダーを使用することであることがわかりました。私はc3p0接続プロバイダーを使用しましたが、これもいくつかの問題を引き起こし、私もそれを解決しました。c3p0のリファレンスリンクはこちらです。Hibernatec3p0接続NewPooledConnectionclose例外

于 2013-02-14T06:11:27.147 に答える