1

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を実装しようとするすべてのステップで問題が発生しました。アップグレードする価値があるのか​​どうか疑問に思い始めています。

4

1 に答える 1

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は、多くのバッチ処理を使用しないアプリケーションでうまく機能することがわかりました。たとえば、私が使用している別のアプリケーションはファイル処理アプリケーションですが、一度に1つのファイルでしか機能しません。OracleDataSourceは、この状況でうまく機能します。また、Webアプリケーションでもうまく機能するようです。9か月前にOracleDataSourceをインストールしたWebアプリがあり、問題はありません。

OracleDataSourceをOracleConnectionPoolDataSourceと同様に機能させる方法があると確信していますが、これは私にとってはうまくいきます。

于 2011-10-27T20:08:21.143 に答える