2011-10-10 4 views
1

ojdbc 코드를 ojdbc14-10.2.0.1.0에서 ojdbc6-11.1.0.7.0으로 업그레이드하려고했습니다. 우리는 데이터 소스 연결에 OracleConnectionCacheImpl을 사용하고 OracleDataSource를 중심으로 Universal Connection Pool로 이동했습니다. 여기에 우리가 현재는 봄에 설정 한 방법입니다범용 연결 풀 메모리 관리

<bean id="myDatasource" class="oracle.ucp.jdbc.PoolDataSourceFactory" factory-method="getPoolDataSource"> 
     <property name="URL" value="@[email protected]"/> 
     <property name="user" value="@[email protected]"/> 
     <property name="password" value="@[email protected]"/> 
     <property name="connectionFactoryClassName" value="oracle.jdbc.pool.OracleDataSource"/> 
     <property name="connectionPoolName" value="MFR_RTE_POOL"/> 
     <property name="minPoolSize" value="5"/> 
     <property name="maxPoolSize" value="100"/> 
     <property name="validateConnectionOnBorrow" value="true" /> 
     <property name="connectionWaitTimeout" value="30"/> 
     <property name="connectionHarvestMaxCount" value="25"/> 
     <property name="connectionHarvestTriggerCount" value="5"/> 
     <property name="maxStatements" value="100"/> 
</bean> 

는 그것은 닫힌 연결 오류없이 실행 얻을 조금 걸렸지 만 지금은 메모리 관리에 문제가 있습니다. ThreadPool을 사용하는 응용 프로그램에 대해 jconsole을 실행했습니다. 이 응용 프로그램은 스레드 풀을 사용하고 ThreadPoolExecutors를 사용하여 파일에서 전달 된 데이터를 기반으로 수수료 요청을 만듭니다. 파일에는 수십만 건의 유료 요청이있을 수 있습니다. 내 문제는 힙의 장기 메모리가 가득 차서 개체를 공개하지 않는다는 것입니다. 성능 테스트에서 내가 설정 한 가비지 콜렉션의 장기 기억은 약 20-25 분 만에 채워지고 자유는 없습니다. 응용 프로그램은 결국 GC 제한 초과 Exception을 치고 연삭 중단에 온다.

이전 OracleConnectionCacheImpl 클래스를 사용하여 동일한 테스트를 실행할 때 문제없이 실행됩니다. 스레드 풀 및 모든 수반되는 코드가 이전 버전의 Spring (1.2.6) 및 이전 ojdbc 드라이버를 사용하여 실행되도록 작성되었지만 OracleConnectionCacheImpl이 Universal Connection Pooling과 다른 방식으로 큰 차이점이 있습니까? 오라클의 JDBC 드라이버 코드의 최신 버전을 수용하려는 경우 내 도메인 모델을 다시 작성하고 싶습니다. 내가 OracleDataSource 연결을 시도하고 비참하게 여러 파일을 동시에 작업 한 후 NullPointerExceptions 실패했습니다. 그런 다음 UCP (이 포럼의 다른 게시물 제안)에서 한 응용 프로그램을 제외한 모든 응용 프로그램에서 정상적으로 작동합니다. 이 시점에서 필자는 내 데이터 소스에 대한 Spring config bean을 더 최적화 할 수 있는지 또는 코드 기반 업그레이드를 고려해야 할지를 판단하려고합니다. 이전에 언급했듯이,이 코드는 오래된 ojdbc 클래스에 대해 잘 실행되지만 UCP를 구현하는 모든 단계에서 문제가 발생했습니다. 나는 심지어 그것의 가치가 업그레이 드하는 경우 궁금해 시작합니다.

나는 마침내 내 문제에 대한 해결책을 알아 않은 :이 문제는 달 동안 저를 도청했다

답변

6

, 나는 내가 생각 해낸 것은 거기에 다른 사람을 도움이되기를 바랍니다. 대신 연결 팩토리로 OracleDataSource를 사용 :

<property name="connectionFactoryClassName" value="oracle.jdbc.pool.OracleDataSource"/> 

을 나는 OracleConnectionPoolDataSource를 시도 제안 :

<property name="connectionFactoryClassName" value="oracle.jdbc.pool.OracleConnectionPoolDataSource"/> 

OracleConnectionPoolDataSource이 OracleDataSource를 확장하고 여러 연결이 여러 자원을 열 수해야하는 응용 프로그램에 더 잘 할 것 같다. 제 경우에는 여러 배치 파일을 처리해야하는 응용 프로그램이 있습니다. 동일한 SQL 코드가 반복적으로 실행되지만 응용 프로그램은 각각의 새 파일에 대해 새로운 연결을 필요로합니다. 이러한 상황에서 OracleDataSource는 종종 연결 오류나 일종의 연결 오류 (예 : SQLException : 닫힌 연결, NullPointerException : 연결이 UCP의 유무에 관계없이 닫힘)에 실패하여 가비지 수집 문제로 이어지게됩니다 (장기 GC가 채워져 GC가 궁극적으로 실패합니다 JVM에 얼마나 많은 메모리를 추가했는지에 상관없이).

많은 배치 처리를 사용하지 않는 응용 프로그램에서 OracleDataSource가 잘 작동하는 것으로 나타났습니다. 예를 들어 내가 사용하는 다른 응용 프로그램은 파일 처리 응용 프로그램이지만 한 번에 하나의 파일에서만 작동합니다. OracleDataSource는이 환경에서 매우 효과적입니다. 또한 웹 응용 프로그램에서도 잘 작동하는 것으로 보입니다. 9 개월 전에 OracleDataSource를 설치 한 웹 앱이 있으며 문제가 없습니다.

OracleConnectionPoolDataSource뿐만 아니라 OracleDataSource를 작동시키는 방법이 있지만이 방법이 유용 할 것입니다.