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를 구현하는 모든 단계에서 문제가 발생했습니다. 나는 심지어 그것의 가치가 업그레이 드하는 경우 궁금해 시작합니다.
나는 마침내 내 문제에 대한 해결책을 알아 않은 :이 문제는 달 동안 저를 도청했다