ojdbcコードをojdbc14-10.2.0.1.0からojdbc6-11.1.0.7.0にアップグレードしようとしています。データソース接続にOracleConnectionCacheImplを使用してから、OracleDataSourceを中心に使用してユニバーサル接続プールに移動しました。Springで現在どのように構成されているかを次に示します。
<bean id="myDatasource" class="oracle.ucp.jdbc.PoolDataSourceFactory" factory-method="getPoolDataSource">
<property name="URL" value="@JDBC_URL@"/>
<property name="user" value="@JDBC_USERNAME@"/>
<property name="password" value="@JDBC_PASSWORD@"/>
<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分でいっぱいになり、解放されることはありません。アプリケーションは最終的にGCLimitExceeded Exceptionに到達し、粉砕が停止します。
古いOracleConnectionCacheImplクラスを使用して同じテストを実行すると、問題なく実行されます。スレッドプールとそれに付随するすべてのコードは、古いバージョンのSpring(1.2.6)と古いojdbcドライバーを使用して実行するように記述されていますが、OracleConnectionCacheImplの動作とユニバーサル接続プーリングの動作には本当に大きな違いがありますか?OracleのJDBCドライバーコードの最新バージョンに対応したい場合は、ドメインモデルを書き直すことを検討していますか。OracleDataSource接続を試しましたが、複数のファイルを同時に処理した後、NullPointerExceptionsで惨めに失敗しました。次に、UCPに行きました(このフォーラムの別の投稿の提案で)。これは、1つのアプリケーションを除くすべてで正常に機能します。この時点で私は mデータソース用にSpringconfigBeanをさらに最適化できるかどうか、またはコードベースのアップグレードについて考え始める必要があるかどうかを判断しようとしています。前に述べたように、このコードは古いojdbcクラスに対して非常にうまく実行されますが、UCPを実装しようとするすべてのステップで問題が発生しました。アップグレードする価値があるのかどうか疑問に思い始めています。