2014-05-25 2 views
0

내 스탠드 자바 애플리케이션에서 우리는 Hibernate JPA 기반 Pooled DataSource를 사용하여 Oracle Database에 연결합니다. 우리는 간헐적으로 다음 예외를 얻고 있습니다. 하지만 다시 시도하면 연결 풀을 만드는 데 성공합니다. 또한 동일한 DB 서버에 접속하는 다른 서비스들도 연결 풀을 성공적으로 생성 할 수 있습니다.Connection (Hibernate, Oracle) 열기시 간헐적 PersistenceException/GenericJDBCException

이 문제를 해결하는 방법은 무엇입니까?

연결 유출 및 진단 방법이있을 수 있습니까? javax.persistence.PersistenceException : org.hibernate.exception.GenericJDBCException : 스레드 "주요"com.xyz.abc.inf.console.ConsoleException

예외 열 수 없습니다 연결

at com.xyz.abc.inf.console.service.GatewayService.postStart(GatewayService.java:104) 

    at com.xyz.abc.inf.console.service.AbstractLaunchableService.start(AbstractLaunchableService.java:205) 

    at com.xyz.abc.inf.console.ConsoleLauncher.main(ConsoleLauncher.java:85) 

에 의해 발생 : javax.persistence.PersistenceException : org.hibernate.exception.GenericJDBCException : 수 열려 있지 연결

at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1387) 

    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1310) 

    at org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:273) 

    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 

    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 

    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 

    at java.lang.reflect.Method.invoke(Method.java:601) 

    at org.springframework.orm.jpa.SharedEntityManagerCreator$DeferredQueryInvocationHandler.invoke(SharedEntityManagerCreator.java:311) 

    at $Proxy102.getResultList(Unknown Source) 

    at com.nrift.finch.inf.domain.repository.RepositoryBase.query(RepositoryBase.java:139) 

    at com.xyz.abc.inf.domain.dao.jpa.impl.ServiceRouteParticipantDaoImpl.findByServiceId(ServiceRouteParticipantDaoImpl.java:55) 

    at com.xyz.abc.inf.service.impl.RouteResolverServiceImpl.getRouteByService(RouteResolverServiceImpl.java:21) 

    at com.xyz.abc.inf.console.service.GatewayService.startCamelContextIfNotStarted(GatewayService.java:143) 

    at com.xyz.abc.inf.console.service.GatewayService.postStart(GatewayService.java:102) 

    ... 2 more 

에 의해 발생 : org.hibernate.exception.GenericJDBCException : 열 수 없습니다 연결

at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:54) 

    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:125) 

    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:110) 

    at org.hibernate.engine.jdbc.internal.LogicalConnectionImpl.obtainConnection(LogicalConnectionImpl.java:304) 

    at org.hibernate.engine.jdbc.internal.LogicalConnectionImpl.getConnection(LogicalConnectionImpl.java:169) 

    at org.hibernate.engine.jdbc.internal.proxy.ConnectionProxyHandler.extractPhysicalConnection(ConnectionProxyHandler.java:82) 

    at org.hibernate.engine.jdbc.internal.proxy.ConnectionProxyHandler.continueInvocation(ConnectionProxyHandler.java:138) 

    at org.hibernate.engine.jdbc.internal.proxy.AbstractProxyHandler.invoke(AbstractProxyHandler.java:81) 

    at $Proxy103.prepareStatement(Unknown Source) 

    at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$5.doPrepare(StatementPreparerImpl.java:147) 

    at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$StatementPreparationTemplate.prepareStatement(StatementPreparerImpl.java:166) 

    at org.hibernate.engine.jdbc.internal.StatementPreparerImpl.prepareQueryStatement(StatementPreparerImpl.java:145) 

    at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1854) 

    at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1831) 

    at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1811) 

    at org.hibernate.loader.Loader.doQuery(Loader.java:899) 

    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:341) 

    at org.hibernate.loader.Loader.doList(Loader.java:2516) 

    at org.hibernate.loader.Loader.doList(Loader.java:2502) 

    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2332) 

    at org.hibernate.loader.Loader.list(Loader.java:2327) 

    at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:490) 

    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:355) 

    at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:195) 

    at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1247) 

    at org.hibernate.internal.QueryImpl.list(QueryImpl.java:101) 

    at org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:264) 

    ... 13 more 

에 의해 발생 : java.sql.SQLException : 클라이언트가 Connection을 체크 아웃하려는 시도가 시간 초과되었습니다.

at com.mchange.v2.sql.SqlUtils.toSQLException(SqlUtils.java:106) 

    at com.mchange.v2.sql.SqlUtils.toSQLException(SqlUtils.java:65) 

    at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:527) 

    at com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource.getConnection(AbstractPoolBackedDataSource.java:128) 

    at org.hibernate.ejb.connection.InjectedDataSourceConnectionProvider.getConnection(InjectedDataSourceConnectionProvider.java:70) 

    at org.hibernate.internal.AbstractSessionImpl$NonContextualJdbcConnectionAccess.obtainConnection(AbstractSessionImpl.java:292) 

데이터베이스 서버 : 오라클 11g

클라이언트 구성 :

[루트 @의 eighamq1 ~] # 개에서 uname -a 리눅스 eighamq1.nrifintech.com 2.6.18-194.el5 # 1 SMP Tue Mar 16 21:52:39 EDT 2010 x86_64 x86_64 x86_64 GNU/Linux

[root @ eighamq1 ~] # cat/etc/redhat-release Red Hat Enterprise Linux 서버 릴리스 5.5 (Tikanga)

[루트 @의 eighamq1 ~] # 자바 -version 자바 버전 "1.7.0" 자바 (TM) SE 런타임 환경 자바 핫스팟 (TM) 64 비트 서버 VM (1.7.0-B147를 구축) (빌드 21.0-b17, 혼합 모드)

[root @ eighamq1 ~] # mvn -v Apache Maven 3.0.4 (r1232337; 2012-01-17 14 : 14 : 56 + 0530) Maven 홈 : /usr/local/maven-3.0.4 Java 버전 : 1.7.0, 공급 업체 : Oracle Corporation Java 홈 :/usr/java/jdk1. 7.0/JRE 기본 로케일 : ko 페이지, 플랫폼 인코딩 : UTF-8 OS 이름 : "리눅스", 버전 : "2.6.18-194.el5"아치 "AMD64"가족 : "유닉스"

사용 JDBC.properties

jdbc.database.driverClass = oracle.jdbc.OracleDriver 
jdbc.database.url = jdbc:oracle:thin:@172.16.29.92:1521:d11gr21 
jdbc.database.initialLimit = 1 

jdbc.database.maxLimit = 5 
jdbc.database.minLimit = 1 
jpa.hibernate.dialectClass = org.hibernate.dialect.Oracle10gDialect 
jdbc.database.initialPoolSize = 10 
jdbc.database.minPoolSize = 5 
jdbc.database.maxPoolSize = 20 
jdbc.database.maxStatements = 0 
jdbc.database.acquireIncrement = 5 
jdbc.database.acquireRetryAttempts = 5 
jdbc.database.checkoutTimeout = 1000 

유물 :

,536,
ojdbc16-11.2.0.1.0.jar 
c3p0-0.9.1.1.jar 
hibernate-entitymanager : 4.1.12.Final 
hibernate-commons-annotations :  4.0.1.Final 
hibernate-c3p0 : 4.1.12.Final 
hibernate-commons-annotations : 4.0.1.Final 
hibernate-jpa-2.0-api : 1.0.1.Final 

답변

0

오라클 씬 드라이버는 Java 보안 API를 내부적으로 사용하여 oracle에 연결합니다.리눅스의 자바 보안은 Entropy Gathering 장치로/dev/random을 사용하며 리눅스의이 장치는 때로는 매우 느린 값을 반환합니다. 이것이 연결을 빨리 열 수없는 이유 일 수 있습니다.

는 명령 행에서이 퍼팅 장치를 변경할 수 있습니다 : 당신이를 사용할 수 있음을 나타냅니다

-Djava.security.egd=file:///dev/urandom 

이 속성을는/dev/urandom을 임의의 값을 얻을 수있는이 장치는 매우 빨리 사용하기 때문이다 의사 난수 알고리즘

Oracle Thin Driver를 사용하여 데이터베이스에 연결하여 성능을 향상시켜 데이터베이스에 연결할 때이 속성을 사용하는 것이 좋습니다.