2013-05-28 19 views
5

Sto usando oracle 11g, hibernate 3 e jsf2.I distribuito la mia applicazione su was7.Every cosa sta andando bene ma quando provo ad accedere dopo 5-6 ore è mi dà errorejava.sql.SQLException: Io eccezione: Connessione ripristinata dal peer: errore di scrittura socket

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) 

io in grado di scoprire come questo errore solve.Please aiuto me.Thanks in anticipo.

Ora ho risolto questo problema con il codice ma non so è il modo corretto o meno. Mi suggerirai, dovrei continuare con questa soluzione su no.

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; 
} 

}

e il mio file di configurazione di ibernazione è

<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> 
+0

Si sta specificando i parametri del database nel file di configurazione di ibernazione o si sta utilizzando un'origine dati definita in was7 e cercato con JNDI? – gkamal

+0

specificando i parametri db nella configurazione di ibernazione solo – RaviPancholi

risposta

4

Probabilmente ci si trova di fronte a un timeout della connessione al database. Su ogni database c'è un timeout quando una connessione è aperta e non c'è attività per un certo periodo. È necessario un gestore del pool di connessioni.

Se si installa c3p0 e lo si configura correttamente, consentirà a Hibernate di mantenere in vita la connessione e/o riaprirla quando necessario.

Ecco uno example per MySQL e Hibernate infatti, ma è lo stesso. Bisogna includere c3p0.jar e anche aggiungere questo al vostro file di configurazione 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> 

Assicurarsi di configurare c3p0.timeout secondo la vostra base di dati!

+0

Ho provato lo stesso ma non funziona. Ci sono anche cambiamenti a livello di codice? – RaviPancholi

+0

Scusa, ho fatto un errore, questo dovrebbe funzionare ora! –

+0

Ora ho provato che funziona bene. Grazie per il mio aiuto. – RaviPancholi

0

Il problema qui è che una connessione inattiva sarà chiusa dal server di database. L'applicazione non viene a conoscenza e tenta di utilizzare una connessione obsoleta (dal pool che è stato creato durante l'inizializzazione). La correzione per questo è configurare il pool di connessioni per eseguire un test di liveness (in genere attivando una query di selezione semplice) prima di utilizzare una connessione dal pool.

Come fare ciò varia in base alla configurazione del pool di origini dati/connessioni. Se fornisci ulteriori dettagli, posso fornire istruzioni più specifiche.

+0

Sto usando solo il pool di connessione di defoult di hibernate 3. Ho impostato proprty in hibernate.cfg.xml. – RaviPancholi

1

Secondo @BalusC

Se si suppone che la vostra applicazione per eseguire un tempo relativamente lungo e per collegare il DB abbastanza spesso, allora considerare l'utilizzo di un pool di connessioni per migliorare le prestazioni di collegamento. Se la vostra applicazione è un'applicazione web, date un'occhiata alla documentazione dell'appserver, di solito fornisce una funzionalità di pool di connessioni nel sapore di un DataSource. Se si tratta di un'applicazione client, cerca le librerie di pool di connessioni di terze parti che hanno dimostrato la loro robustezza con anni, come ad esempio Apache Commons DBCP (comunemente usato, usato in appserver), C3P0 (conosciuto da Hibernate) e Proxool (se vuoi Connessioni XA).

Problemi correlati