2つのプログラムで同じ問題が発生しました。私のエラーはこれでした:
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
この問題を解決するために数日を費やしています。さまざまなWebサイトで言及されている多くのアプローチをテストしましたが、どれも機能しませんでした。最後に、コードを変更して、何が問題なのかを見つけました。さまざまなアプローチについてお話しし、ここでそれらをまとめてみます。
私はこのエラーの解決策を見つけるためにインターネットを探していましたが、少なくとも1人で機能する多くの解決策が あることがわかりましたが、他の人はそれが彼らのために機能しないと言います!このエラーには多くのアプローチがあるのはなぜですか?このエラーは、サーバーへの接続に問題がある場合に一般的に発生する
ようです。たぶん問題は、クエリ文字列が間違っているか、データベースへの接続が多すぎるためです。
したがって、すべてのソリューションを1つずつ試してみて、giveめないでください。
ここに私がインターネットで見つけた解決策があり、それぞれについて、少なくとも彼の問題がその解決策で解決された人がいます。
ポイント:MySQLの設定を変更する必要があるソリューションについては、次を参照することはできません。
ソリューションは次のとおりです。
「bind-address」属性のコメントを解除するか、次のIpsのいずれかに変更します。
bind-address = "127.0.0.1"
または
bind-address = "0.0.0.0"
MySQL構成ファイルに「skip-networking」行がある場合は、その行の先頭に「#」記号を追加してコメントにします。
- 「wait_timeout」および「interactive_timeout」を変更します
次の行をMySQL構成ファイルに追加します。
wait_timeout = number
interactive_timeout = number
connect_timeout = 数値
ファイアウォール、またはウイルス対策ソフトウェアがMySQLサービスをブロックしないようにしてください。
クエリ文字列を確認してください。接続文字列は次のようになります。
dbName = "my_database";
dbUserName = "root";
dbPassword = "";
String connectionString = "jdbc:mysql://localhost/" + dbName + "?user=" + dbUserName + "&password=" + dbPassword + "&useUnicode=true&characterEncoding=UTF-8";
文字列にスペースが含まれていないことを確認してください。すべての接続文字列は、スペース文字なしで継続する必要があります。
「localhost」を127.0.0.1などのポートに置き換えてみてください。次のように、接続文字列にポート番号を追加してください。
String connectionString = "jdbc:mysql://localhost:3306/my_database?user=root&password=Pass&useUnicode=true&characterEncoding=UTF-8";
通常、MySQLのデフォルトポートは3306です。
ユーザー名とパスワードをMySQLサーバーのユーザー名とパスワードに変更することを忘れないでください。
- JDKドライバーライブラリファイルを更新する
- 異なるJDKおよびJRE(JDK 6および7など)をテストする
- max_allowed_packetを変更しないでください
「max_allowed_packet」は、MySQL構成ファイルの変数であり、パケットの最大数ではなく、最大パケットサイズを示します。したがって、このエラーを解決することはできません。
TOMCAT6_SECURITY = yesをTOMCAT6_SECURITY = noに変更します
validationQuery = "select now()"を使用して、各クエリに応答があることを確認してください
次のコードを接続文字列に追加します。
&autoReconnect=true&failOverReadOnly=false&maxReconnects=10
これらのソリューションはどれも私にとってはうまくいきませんでしたが、試してみることをお勧めします。これらの手順に従うことで問題をどのように解決したかという人がいるからです。
しかし、何が私の問題を解決しましたか?私の問題は、データベースに多くのSELECTがあったことです。接続を作成してから閉じるたびに。私は毎回接続を閉じましたが、システムは多くの接続に直面し、そのエラーを与えました。私がしたことは、接続変数をクラス全体のパブリック(またはプライベート)変数として定義し、コンストラクターで初期化することでした。その後、その接続を使用するたびに。それは私の問題を解決し、スピードを劇的に向上させました。
結論
この問題を解決する簡単でユニークな方法はありません。自分の状況について考え、上記の解決策を選択することをお勧めします。プログラムの開始時にこのエラーを受け取ったが、データベースにまったく接続できない場合、接続文字列に問題がある可能性があります。しかし、データベースへのいくつかの正常な相互作用の後にこのエラーを受け取った場合、問題は接続数にある可能性があり、「wait_timeout」および他のMySQL設定の変更を検討するか、接続数を減らす方法でコードを書き直すことができます。