2017-06-17 19 views
0

Oracle 11gデータベースにアクセスするためにSpring JdbcTemplateとの接続プーリングにc3p0 ComboPooledDataSourceを使用しました。 (ネットワークが短時間停止したように見える)しばらくすると、プールから接続を取得するすべての要求にタイムアウト例外が発生します。これは、Weblogicサーバーが再起動されるまで(データベースサーバーを再起動する必要はありません)解決されません。サーバの再起動までC3P0接続が復旧しない

Caused by: com.mchange.v2.resourcepool.TimeoutException: A client timed out while waiting to acquire a resource from [email protected] -- timeout at awaitAvailable() 
    at com.mchange.v2.resourcepool.BasicResourcePool.awaitAvailable(BasicResourcePool.java:1317) 
    at com.mchange.v2.resourcepool.BasicResourcePool.prelimCheckoutResource(BasicResourcePool.java:557) 
    at com.mchange.v2.resourcepool.BasicResourcePool.checkoutResource(BasicResourcePool.java:477) 
    at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:525) 

Iはデータベース現在のセッションともC3P0ログをチェックしているとは接続リークが(1550のみ50の接続が使用されている)が存在しません。 また、ネットワークの停止後、c3p0によって新しい接続が取得されないことにも留意しました(acquire_incrementは増加しますが、管理接続は50から10に下がり続けます)。

当社のデータソース設定:

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> 
     <property name="properties" > 
      <props> 
       <prop key="oracle.net.CONNECT_TIMEOUT">20000</prop> 
       <prop key="oracle.jdbc.ReadTimeout">70000</prop> 
      </props> 
     </property> 
     <!-- Connection properties --> 
     <property name="driverClass" value="oracle.jdbc.driver.OracleDriver"/> 
     <property name="jdbcUrl" value="jdbc:oracle:thin:@//host:port/db_name"/> 
     <property name="user" value="*****"/> 
     <property name="password" value="*****"/> 
     <!-- Pool properties --> 
     <property name="testConnectionOnCheckout" value="true"/> 
     <property name="checkoutTimeout" value="30000" /> 
     <property name="debugUnreturnedConnectionStackTraces" value="true" /> <!-- Turn this on only for debugging --> 
     <property name="preferredTestQuery" value="select 1 from dual"/> 
     <property name="initialPoolSize" value="3" /> 
     <property name="maxAdministrativeTaskTime" value="30" /> 
     <property name="maxIdleTime" value="600" /> 
     <property name="maxPoolSize" value="1550" /> 
     <property name="maxStatements" value="0" /> <!-- Disable statement pooling --> 
     <property name="maxStatementsPerConnection" value="0" /> <!-- Disable statement pooling --> 
     <property name="minPoolSize" value="5" /> 
     <property name="numHelperThreads" value="15" /> 
     <property name="unreturnedConnectionTimeout" value="600" /> <!-- Should set this for debugging leaks --> 
    </bean> 

私は本当に何が起こっているのか見当がつかない。

更新 申し訳ありませんが、編集した設定(テストは私の実際の設定ファイルに私の質問に間違っていたではなく)

答えて

0

いくつかのこと:

  1. あなたは、接続テストを取得することはできませんあなたはあなただと思います。 TestConnectionOnCheckoutというプロパティを設定しましたが、プロパティの名前はtestConnectionOnCheckoutで、小文字の場合はtです。
  2. あなたは接続リークの可能性があります。 50は、アプリケーションがフリーズしたときに使用される奇数回の接続で、maxPoolSizeが1550の場合、バックエンドがサポートするものよりも高いため、無意味な可能性があります。
  3. unreturnedConnectionTimeoutdebugUnreturnedConnectionStackTracesを設定して接続リークをデバッグしますが、unreturnedConnectionTimeoutは非常に長くなります。物事が凍結してから、最終的に漏れた接続のチェックアウトスタックトレースを(ログに)観察する前に、10分待たなければなりません。 30秒のようなデバッグをしている間にこれを小さくすることを検討してください。そうすれば、Connectionリークに関する合理的な情報が得られます。
  4. properties,user、およびpasswordを異なる値として設定します。それはそれほど大きくないかもしれません。最終的にはuserpasswordがJDBCプロパティーに設定されます。 とpasswordが、propertiesプロパティが設定される前に設定されている場合は、正しいユーザー名とパスワードを使用せずに、認証情報を使用してプロパティオブジェクトを置き換えることができます。あなたが明示的に何かのような...

    <property name="properties" > 
        <props> 
         <prop key="oracle.net.CONNECT_TIMEOUT">20000</prop> 
         <prop key="oracle.jdbc.ReadTimeout">70000</prop> 
         <prop key="user">*****</prop> 
         <prop key="password">*****</prop> 
        </props> 
    </property> 
    

でそうすることを検討し、propertiesを設定している場合...あなたがuserpasswordがセットされますことを確認することができます。

c3p0 PooledDataSourcesはプールの初期化時にINFOに設定を記録します。それを見て、見たいと思う設定であることを確認する価値があります。

+0

(ちょっと更新しました) –

+0

申し訳ありませんがTestConnectionOnCheckout、それは私の質問で間違いでした。質問が更新されました。 –

関連する問題