web-dev-qa-db-ja.com

autoReconnect = trueが機能しないように見えるのはなぜですか?

JDBCを使用してMySQLサーバーに接続しています(接続プールはないと思います)。接続URLに_autoReconnect=true_があります

しかし、私の接続はまだタイムアウトします。 conn.isClosed()とそのfalseもチェックしました。しかし、接続を使用しようとすると、次の例外が発生します。

 com.mysql.jdbc.CommunicationsException:基礎となる例外による通信リンク障害:
 
 ** BEGIN NESTED EXCEPTION ** 
 
 Java。 net.SocketException 
 MESSAGE:ソフトウェアによる接続の中止:ソケット書き込みエラー
 
 STACKTRACE:
 
 Java.net.SocketException:ソフトウェアによる接続中止:ソケット書き込みエラー
 ... 

Java 1.6ではconn.isValid(0)を使用して接続を確認できますが、Java 1.5を使用しています。

タイムアウトしないようにする方法はありますか?または、Java 1.6にアップグレードする必要がありますか?

32
Pyrolistical

私は同じ問題を抱えていて、それは絶対に厄介でした。 MySQLのWebサイトでのドキュメントの説明は次のとおりです(強調は私のものです)

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

私の経験では、「次のクエリで再接続する」機能も機能していないようですが、MySQL 4.0を使用していたため、その理由があった可能性があります。

結局、例外をキャッチし、その特定のエラーをチェックし、可能であれば再接続してクエリを再試行するミニフレームワークを作成しました。

[〜#〜] eta [〜#〜]このリンク は、もう少し情報を提供し、autoReconnectがとにかく将来的には削除されるでしょう。

33
Eric Petroelje

autoReconnectは引き続き例外をスローするため、必要に応じて状況について何かを選択できます。それをキャッチすると、接続が後で再び存在することがわかります。 (トランザクションの場合はさらに複雑になります-現在のトランザクションはかなり死んでいます)。

2
chaos