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つずつ試して、あきらめないことをお勧めします。
これが私がインターネットで見つけた解決策であり、それぞれについて、少なくとも彼の問題がその解決策で解決された人がいます。
ヒント:MySQL設定を変更する必要があるソリューションについては、次のファイルを参照できます。
-
Linux:
/etc/mysql/my.cnf
または/etc/my.cnf
(使用するLinuxディストリビューションとMySQLパッケージによって異なります) -
Windows:
C:\**ProgramData**\MySQL\MySQL Server 5.6\my.ini
(プログラムファイルではなく、ProgramDataであることに注意してください)
解決策は次のとおりです。
-
bind-address
を変更する 属性:bind-address
のコメントを外します 属性を設定するか、次のIPのいずれかに変更します。bind-address="127.0.0.1"
または
bind-address="0.0.0.0"
-
「スキップネットワーキング」のコメント
skip-networking
がある場合 MySQL構成ファイルの行に、#
を追加してコメントを付けます その行の先頭に署名します。 -
「wait_timeout」と「interactive_timeout」を変更します
次の行をMySQL構成ファイルに追加します:
[wait_timeout][1] = *number* interactive_timeout = *number* connect_timeout = *number*
-
Javaが「localhost」を[127.0.0.1]ではなく[:::1]に変換していないことを確認してください
MySQLは
127.0.0.1
を認識するため (IPv4
)ただし、:::1
ではありません (IPv6
)これは、次の2つのアプローチのいずれかを使用することで回避できます。
-
接続文字列では、
127.0.0.1
を使用しますlocalhost
の代わりにlocalhost
を避けるため:::1
に翻訳されています -
オプション
-Djava.net.preferIPv4Stack=true
を指定してjavaを実行します JavaにIPv4
を使用させるIPv6
の代わりに 。 Linuxでは、これは実行する(または/etc/profile
内に配置する)ことでも実現できます。 :export _JAVA_OPTIONS="-Djava.net.preferIPv4Stack=true"
-
-
オペレーティングシステムのプロキシ設定、ファイアウォール、ウイルス対策プログラムを確認してください
ファイアウォールまたはウイルス対策ソフトウェアがMySQLサービスをブロックしていないことを確認してください。
Linuxでiptablesを一時的に停止します。 iptablesが正しく構成されていない場合、tcpパケットをmysqlポートに送信することはできますが、tcpパケットが同じ接続に戻るのをブロックする可能性があります。
# Redhat enterprise and CentOS systemctl stop iptables.service # Other linux distros service iptables stop
Windowsでウイルス対策ソフトウェアを停止します。
-
接続文字列を変更
クエリ文字列を確認してください。接続文字列は次のようになります:
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構成ファイルの変数です。したがって、このエラーの解決には役立ちません。
- Tomcatのセキュリティを変更する
TOMCAT6_SECURITY=yesをTOMCAT6_SECURITY=no
に変更します- validationQueryプロパティを使用する
validateQuery ="select now()"を使用して、各クエリに応答があることを確認します
- 自動再接続
次のコードを接続文字列に追加します:
&autoReconnect=true&failOverReadOnly=false&maxReconnects=10
これらの解決策はどれも私には効果がありませんでしたが、試してみることをお勧めします。これらの手順に従うことで問題を解決した人がいるからです。
しかし、何が私の問題を解決しましたか?
私の問題は、データベースに多くのSELECTがあることでした。接続を作成してから閉じるたびに。毎回接続を閉じていましたが、システムが多くの接続に直面し、そのエラーが発生しました。 私が行ったことは、接続変数をクラス全体のパブリック(またはプライベート)変数として定義し、コンストラクターで初期化することでした。 その後、毎回その接続を使用しました。それは私の問題を解決し、また私のスピードを劇的に向上させました。
#結論#この問題を解決するための簡単でユニークな方法はありません。自分の状況を考えて、上記の解決策を選択することをお勧めします。プログラムの開始時にこのエラーが発生し、データベースにまったく接続できない場合は、接続文字列に問題がある可能性があります。ただし、データベースとのやり取りが何度か成功した後にこのエラーが発生した場合は、接続数に問題がある可能性があり、「wait_timeout」やその他のMySQL設定を変更するか、コードを書き直して接続数を減らすことを検討してください。