2013-05-28 2 views
5

oracle 11g, hibernate 3 및 jsf2.I를 사용하고 있습니다. was7.Every에 응용 프로그램을 배포했으나 나중에 로그인하려고 시도합니다. 그것이 5-6시간 내가없는이 오류를 사전에 도움이 와요 고마워요 solve.Please하는 방법을 찾기 위해 나에게 오류java.sql.SQLException : Io 예외 : 피어에 의한 연결 재설정 : 소켓 쓰기 오류

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

최대 절전 모드 구성 파일에 데이터베이스 매개 변수를 지정했거나 was7에 정의 된 데이터 원본을 사용하고 JNDI를 사용하여 조회하고 있습니까? – gkamal

+0

최대 절전 모드 설정에서만 db 매개 변수를 지정 – RaviPancholi

답변

4

아마도 데이터베이스 연결 시간 초과가 있습니다. 모든 데이터베이스에는 연결이 열려 있고 특정 기간 동안 활동이 없을 때 시간 종료가 있습니다. 연결 풀 관리자가 필요합니다.

c3p0을 설치하고 올바르게 구성하면 최대 절전 모드가 연결을 유지하고 필요할 때 다시 열 수 있습니다.

여기에 MySQL과 최대 절전 모드의 경우 실제로 example이지만 동일합니다. 당신은 당신의 hibernade 구성 파일이 추가도 c3p0.jar을 포함하고 있습니다

<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를 구성해야합니다!

+0

나는 똑같이 시도했지만 그게 효과가 없었다. 코드 레벨 변경도 있습니까? – RaviPancholi

+0

죄송합니다, 실수로,이 지금 작동해야합니다! –

+0

이제 제대로 작동하는지 테스트했습니다. 내 도움에 감사드립니다. – RaviPancholi

0

문제입니다 유휴 연결이 데이터베이스 서버에 의해 폐쇄 될 것입니다. 응용 프로그램은 그것에 대해 알지 않고 초기화되지 않은 연결 (초기화 중에 만들어진 풀에서)을 사용하려고합니다. 이 문제를 해결하기 위해 풀에서 연결을 사용하기 전에 연결 풀이 활성 테스트를 수행하도록 구성합니다 (일반적으로 간단한 선택 쿼리를 실행하여).

방법은 데이터 소스/연결 풀링 설정 방법에 따라 다릅니다. 당신이 그것에 대한 자세한 내용을 제공하면 더 구체적인 지침을 제공 할 수 있습니다.

+0

나는 hibernate 3의 defoult 연결 풀링을 사용하고있다. 나는 hibernate.cfg.xml에서 proprty를 설정했다. – RaviPancholi

1

응용 프로그램이 상대적으로 긴 시간을 실행하고 매우 자주 DB를 연결 한 후 연결 성능을 향상시키기 위해 연결 풀을 사용하는 것이 예상되는 경우 @BalusC

에 따르면. 응용 프로그램이 웹 응용 프로그램 인 경우 응용 프로그램 서버의 설명서를 살펴보고 일반적으로 DataSource의 특성에 맞는 연결 풀링 기능을 제공합니다. 그것이 클라이언트 애플리케이션이라면 아파치 Commons DBCP (일반적으로 많이 사용되는 appservers에서 사용됨), C3P0 (Hibernate에서 알려짐), Proxool (원하는 경우) 등 수년간 견고성이 입증 된 타사 연결 풀링 라이브러리를 찾아보십시오 XA 연결).

관련 문제