7

Oracle 11g、hibernate 3、および jsf2 を使用しています。アプリケーションを was7 にデプロイしました。すべて順調に進んでいますが、5 ~ 6 時間後にログインしようとすると、エラーが発生します。

ERROR org.hibernate.util.JDBCExceptionReporter - Io exception: Connection reset by peer: socket write error
[5/28/13 11:31:25:048 IST] 00000024 SystemErr     R org.hibernate.exception.GenericJDBCException: could not execute query
    at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:126)
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:114)
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
    at org.hibernate.loader.Loader.doList(Loader.java:2231)
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2125)
    at org.hibernate.loader.Loader.list(Loader.java:2120)
    at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:401)
    at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:361)
    at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:196)
    at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1148)
    at org.hibernate.impl.QueryImpl.list(QueryImpl.java:102)

このエラーの解決方法がわかりません。助けてください。よろしくお願いします。

今、私はこの問題をコードで解決しましたが、それが適切な方法であるかどうかはわかりません.提案してくれませんか.

public class ApplicationUtilityBean implements Serializable {
private SessionFactory sessionFactory;
private AnnotationConfiguration cfg;
public String filePath;
private String realPath = Config.PATH;

public ApplicationUtilityBean() throws URISyntaxException {
    getConnection();
}

public void getConnection() {
    URL r = this.getClass().getClassLoader().getResource("hibernate.cfg.xml");
            cfg = new AnnotationConfiguration();
    cfg.configure(r);
    String pwd = cfg.getProperty("hibernate.connection.password");
    TripleDESEncryption tripledesenc = null;
    try {
        tripledesenc = new TripleDESEncryption();
    } catch (Exception e) {
        e.printStackTrace();
    }
    cfg.setProperty("hibernate.connection.password",
            tripledesenc.decrypt(pwd));
    sessionFactory = cfg.buildSessionFactory();

    System.out.println("cfg: " + cfg);
    System.out.println("sessionFactory: " + sessionFactory);
}

public Session getSession() {
    System.out.println("Going to get session");
    Session session = null;
    try {
        System.out.println("cfg is: " + cfg);
        System.out.println("sessionFactory: " + sessionFactory);
        session = sessionFactory.openSession();
        if(session != null){
            try {
                Transaction trxn = session.beginTransaction();
                Query queryResult = session.createSQLQuery("select * from dual");
                List<GTS_USER>listgtsuser = queryResult.list();     
                                } catch (Exception e) {                 
                e.printStackTrace();
                System.out.println("Creating new connection............");
                session.close();
                sessionFactory.close();
                getConnection();
                session = sessionFactory.openSession();
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return session;
}

}

そして私の休止状態の設定ファイルは

<hibernate-configuration>
<session-factory>

    <property name="hibernate.cache.region.factory_class">net.sf.ehcache.hibernate.EhCacheRegionFactory</property>
    <property name="hibernate.cache.use_query_cache">true</property>
    <property name="hibernate.cache.use_second_level_cache">true</property>

    <property name="hibernate.connection.driver_class">oracle.jdbc.OracleDriver</property>
    <property name="hibernate.connection.url">jdbc:oracle:thin:@xxxxxxxxx:1521:HMS</property>
    <property name="hibernate.connection.username">xxxxx</property>
    <property name="hibernate.connection.password">xxxxxxxxxxx</property>
    <property name="hibernate.connection.pool_size">10</property> 
    <property name="show_sql">true</property>
    <property name="dialect">org.hibernate.dialect.OracleDialect</property>
    <property name="hibernate.hbm2ddl.auto">update</property>
4

3 に答える 3

8

データベース接続のタイムアウトに直面している可能性があります。すべてのデータベースでは、接続が開いているときにタイムアウトが発生し、一定期間アクティビティがありません。接続プール マネージャーが必要です。

正しくインストールc3p0して構成すると、休止状態で接続を維持したり、必要なときに再度開いたりすることができます。

これは実際には MySQL と Hibernateの例ですが、同じです。c3p0.jarこれを hibernade 構成ファイルに含めて追加する必要があります。

<property name="c3p0.min_size">5</property>
<property name="c3p0.max_size">20</property>
<property name="c3p0.timeout">1800</property>
<property name="c3p0.max_statements">50</property>
<property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>

c3p0.timeoutデータベースに合わせて設定してください。

于 2013-05-28T07:12:08.840 に答える
2

ここでの問題は、アイドル状態の接続がデータベース サーバーによって閉じられることです。アプリケーションはそれを認識せず、(初期化中に作成されたプールから) 古い接続を使用しようとします。これを修正するには、プールからの接続を使用する前に、(通常は単純な選択クエリを起動することによって) ライブネスのテストを行うように接続プールを構成します。

これを行う方法は、データソース/接続プーリングのセットアップ方法によって異なります。詳細を教えていただければ、より具体的な指示を出すことができます。

于 2013-05-28T07:11:08.320 に答える
1

@BalusCによると

アプリケーションが比較的長時間実行され、かなり頻繁に DB に接続することが想定されている場合は、接続プールを使用して接続パフォーマンスを向上させることを検討してください。アプリケーションが Web アプリケーションの場合は、appserver のドキュメントを参照してください。通常は、DataSource のフレーバーで接続プール機能を提供します。クライアント アプリケーションの場合は、Apache Commons DBCP (一般的に使用され、多くのアプリケーション サーバーで使用される)、C3P0 (Hibernate で知られる)、Proxool (必要な場合) など、長年にわたって堅牢性が証明されているサード パーティの接続プーリング ライブラリを探します。 XA 接続)。

于 2013-08-06T06:56:15.613 に答える