1

APIがしばらくアイドル状態になるたびに、データベースへの接続が失われます(時間を正確に定義することはできません。数秒のアイドル時間の後、場合によっては数分後のアイドル時間、場合によっては突堤の再起動直後でも発生する可能性があります)。この問題はさまざまなマシンで再現できるため、mysqlデータベースとは直接関係がないことを確認します。

スローされた例外はここにあります

データベース構成は、休止状態と春に基づいています。

 <!-- c3p0 of version 0.9.2.1 (current stable) -->
 <!-- spring data: 1.2.0.RELEASE -->
 <!-- mysql connector: 5.1.18 -->
 <!-- hibernate: 4.1.9.FINAL --> 
 <bean id="basisDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
    <property name="driverClass" value="${jdbc.driverClassName}" />
    <property name="jdbcUrl" value="${jdbc.url}" />
    <property name="user" value="${jdbc.username}" />
    <property name="password" value="${jdbc.password}" />
    <property name="minPoolSize" value="5" />
    <property name="maxPoolSize" value="20" />
    <property name="maxIdleTime" value="600" />
    <property name="maxConnectionAge" value="86400" />
</bean>

<bean id="entityManagerFactory"
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="packagesToScan" value="de.yourdelivery.data.*" />
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
            <property name="generateDdl" value="false" />
            <property name="showSql" value="true" />
            <property name="database" value="MYSQL" />
        </bean>
    </property
</bean>

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>

データベース接続とドライバーは次のとおりです。

jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://xxx:3306/xxx?zeroDateTimeBehavior=convertToNull

jdbc.urlを次のように拡張しても機能しません

&autoReconnect=true&autoReconnectForPools=true

私はOpenSessionInViewパターンを使用して、ドーザーマッピング中に必要なすべての関係を遅延ロードします(これはアンチパターンと見なされることはわかっていますが、これまでのところ正常に機能しているため、現在そのパターンを非難していません)

Mysqlwait_timeoutは28800に設定されています

C3POの起動ログは次のようになります

プロパティ]13:34:54,823 INFO MLog:80-log4jロギングを使用するMLogクライアント。13:34:54,883 INFO C3P0Registry:204-c3p0-0.9.1.2を初期化しています[2007年5月21日15:04:56にビルドされました。デバッグ?true; trace:10] 13:34:55,111 INFO XmlWebApplicationContext:1350-タイプ[classcom.mchange.v2.c3p0.ComboPooledDataSource]のBean'deDataSource'は、すべてのBeanPostProcessorsによる処理の対象ではありません(例:auto-の対象ではありません)プロキシ)13:34:55,148 INFO XmlWebApplicationContext:1350-タイプ[classcom.mchange.v2.c3p0.ComboPooledDataSource]のBean'plDataSource'は、すべてのBeanPostProcessorsによる処理の対象ではありません(例:自動プロキシの対象ではありません) 13:34:55,150 INFO XmlWebApplicationContext:1350-タイプ[classde.yourdelivery.data.routing。のBean'dataSource'。*、password =*}、propertyCycle-> 0、testConnectionOnCheckin-> false、testConnectionOnCheckout-> false、unreturnedConnectionTimeout-> 0、usesTraditionalReflectiveProxies-> false] 13:34:56,086 INFO方言:123-HHH000400:方言の使用:org.hibernate.dialect.MySQLDialect 13 :34:56,095 INFO LobCreatorBuilder:120-HHH000424:createClob()メソッドがエラーをスローしたときにコンテキストLOBの作成を無効にする:java.lang.reflect.InvocationTargetException 13:34:56,108 INFO TransactionFactoryInitiator:73-HHH000268:トランザクション戦略:org.hibernate.engine .transaction.internal.jdbc.JdbcTransactionFactory 13:34:56,112 INFO ASTQueryTranslatorFactory:48-HHH000397:ASTQueryTranslatorFactoryの使用13:34:56,149 INFOバージョン:24-Hibernate Validator 4.2.0.Final 13:34:56,916 INFO XmlWebApplicationContext:1350-Bean 'タイプ[classorg.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean]のentityManagerFactory'は、すべてのBeanPostProcessorsによる処理の対象にはなりません(例:自動プロキシの対象にはなりません)

では、なぜアプリケーションはアイドル時間中に接続を失うのでしょうか。

4

4 に答える 4

1

Interesting problem

It can happen due to possibly multiple reasons. your app server is losing connections to your DB. It is hard to tell looking at the logs that only connections which are idle are the only one which are getting killed. Your DB server might be not allocating connections. I hope you have checked your DB logs for errors. How you are handling transactions in your services ? Are you using spring transactions ?

It’s a good idea always to specify destroy-method if you are using external connection pool provider , so as to shutdown the data source immediately when the spring application shuts down

<bean id="basisDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">

Change the following in your c3p0 pool settings

Take two approaches Remove maxConnectionAge & maxIdleTime

Test by changing below two parameters , they are expensive in terms of performance hit

testConnectionOnCheckout =true 
preferredTestQuery =SELECT 1

In case if you are able to resolve it using the above settings

Change the above settings to below as the below is less expensive in terms of performance hit

idleConnectionTestPeriod – 30 
preferredTestQuery =SELECT 1

Post your findings

于 2013-02-10T04:06:36.423 に答える
0

ファイアウォールなどのネットワークアプライアンスが接続を切断しないように、定期的な接続テストが必要です。ここにすべての詳細:C3P0構成

于 2013-02-01T19:26:46.033 に答える
0

確認します

  • mysqlがその側から接続を閉じていないかどうか-my.cnfのwait_timeoutの値は何ですか?

  • hibernateが独自の内部接続プールを使用している場合は、hibernate.connection.provider_classを設定する必要がありますが、Hibernate構成を投稿できますか?http://docs.jboss.org/hibernate/orm/4.1/devguide/en-US/html_single/#d5e150を参照してください

于 2013-02-05T22:17:55.937 に答える
0

まず、「user395072」によって提案されているように、アプリケーションBean構成にdestroyメソッドを追加することをお勧めします。

それ以外の場合は、mySQL接続とサーバー構成のプロパティを確認してください。mySQLには約1000クエリのデフォルト制限があると思います(これはmySQL 5.24で見ました)。切断は、私の推測では、mySQL層で発生します。サーバーは、接続が不要になったと「考えている」可能性があります。「切断」するための固定の時間枠または切断に関連するユーザーイベントがあった場合、アプリケーション構成の問題が発生する可能性があります。

あなたの場合、それはデータベースサーバーの構成だと強く思います。

于 2013-02-10T21:21:18.450 に答える