web-dev-qa-db-ja.com

MySqlとの接続は自動的に中止されます。 Connector / Jを適切に構成する方法は?

エラーメッセージからこのアドバイスを読みました。

この問題を回避するには、アプリケーションで使用する前に接続の有効性を期限切れにするかテストするか、クライアントタイムアウトのサーバー構成値を増やすか、Connector/J接続プロパティ 'autoReconnect = true'を使用することを検討してください。

SpringとJPAを使用しています。 Connector/Jはどこで構成する必要がありますか? (persistence.xml、またはentityManagerFactoryスプリング構成、またはdateSourceスプリング構成、または他のどこか?)

48
Roman

テキストでは、接続の中断を防ぐための3つのソリューションについて説明しています。

  1. 接続文字列をautoReconnect=trueで構成します。これはURL接続文字列のプロパティであり、ドライバーレベルで機能します。データソース構成の接続文字列を変更する必要があります。

    url="jdbc:mysql://localhost:3306/confluence?autoReconnect=true"
    
  2. タイムアウトを増やします。これは通常、データベースのプロパティです。この値を増やして、接続の中断が少なくなるかどうかを確認できます。

  3. 接続検証をテストするために接続プールを構成します。これは、ドライバーレベルではなくプールで行われます。これは、使用するデータソースの実装に依存します。ただし、プールされたものを使用する場合は、データソースのプロパティで構成可能にする必要があります。 c3p

追加コメント:

  • データソース/プールには、アイドル接続がプール内に残っている時間に対応するタイムアウトを設定することもできます。 dbタイムアウトと混同しないようにします。
  • 接続の有効性をテストする方法はいくつかあります。一般的な方法の1つは、ダミーのテストテーブルを用意することです。プールは、ダミーのテストテーブルでselectを発行して、接続がまだ正常かどうかを確認します。
66
ewernli

AutoReconnectは推奨されません。 MySQLから ここ

ドライバーは、古い接続や切断された接続を再確立しようとしますか?有効にした場合、ドライバは、現在のトランザクションに属する古い接続またはデッド接続で発行されたクエリに対して例外をスローしますが、新しいトランザクションの接続で発行された次のクエリの前に再接続を試みます。この機能の使用は、アプリケーションがSQLExceptionsを適切に処理しない場合にセッション状態とデータの一貫性に関連する副作用があり、アプリケーションを構成してSQLExceptionsデッドおよび古い接続を適切に。または、最後のオプションとして、MySQLサーバー変数「wait_timeout」をデフォルトの8時間ではなく高い値に設定することを検討してください。

18
Gaurav Agarwal

私は多くの解決策を経験しましたが、問題は解決しましたが、しばらくすると接続がタイムアウトするか切断されました。23日後、問題を解決する解決策が得られました。

多くの解決策は、autoReconnect = trueを使用することをお勧めしますが、ドキュメントを読んでいたときに。ソースに次のテキストがあり、autoReconnectパラメーターについて説明しています。

この機能の使用は、セッション状態とデータの一貫性に関連する副作用があるため、お勧めしません

Hibernateコードを調べたとき。 Hibernateの基本的な接続メカニズムは再接続をサポートしていません。H3C0接続プールを使用する必要があります(それ自体は常に再接続をサポートしていませんでした)。

しかし、一度H3C0を使用すると、デフォルトの動作はリクエストを処理するように思われます。接続が停止している場合、ユーザーにはエラーが表示されますが、少なくとも次のリクエストでは再接続します。 1つのエラーは無限のエラーよりも優れていると考えられますが、それでもエラーはゼロではありません。リクエスト前に接続をテストするとパフォーマンスが低下する可能性があるため、ドキュメントでは推奨されていないoptiontestConnectionOnCheckoutが必要であることがわかりました。確かに、ソフトウェアはまず動作しなければならず、次に動作するのは高速でなければなりません。

要約すると、「作業」への接続を取得するには(エラーなしで再接続することにより、ドロップされた接続を処理することを定義します):「hibernate.cfg.xml」で:

  <!-- hibernate.cfg.xml -->
    <property name="c3p0.min_size">5</property>
    <property name="c3p0.max_size">20</property>
    <property name="c3p0.timeout">1800</property>
    <property name="c3p0.max_statements">50</property>
    <!-- no "connection.pool_size" entry! -->

次に、ファイル「c3p0.properties」を作成します。このファイルは、クラスパスのルートにある必要があります(つまり、アプリケーションの特定の部分でオーバーライドする方法はありません)。

c3p0.properties

c3p0.testConnectionOnCheckout = true

この解決策が機能しない場合、考えられる解決策は他にもあります。

1. Add

<property name="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>

 Also dont forget to place the c3p0-0.9.1.jar in the classpath. 



    2. Instead of using that c3p0.properties file, couldn't you just use this property in your hibernate.cfg.xml:

<property name="hibernate.c3p0.validate">true</property>

    Also checkout the last post on this page:

    https://forum.hibernate.org/viewtopic.php?p=2399313

    If all these not work than go [more][1] and read in detail


  [1]: http://hibernatedb.blogspot.in/2009/05/automatic-reconnect-from-hibernate-to.html
0
Ravindra