MySQLデータベースに接続する私のプログラムは正常に機能していました。次に、接続のセットアップに使用されるコードを変更せずに、この例外が発生します。
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.
どうした?
接続を取得するために使用されるコード:
private static Connection getDBConnection() throws SQLException, InstantiationException, IllegalAccessException, ClassNotFoundException {
String username = "user";
String password = "pass";
String url = "jdbc:mysql://www.domain.com:3306/dbName?connectTimeout=3000";
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection(url, username, password);
return conn;
}
これはラップされた例外であり、あまり興味深いものではありません。根本原因について実際に何かを伝えるのは、例外の根本原因です。スタックトレースをもう少し見てください。その後、_SQLException: Connection refused
_または_SQLException: Connection timed out
_に直面する可能性が高くなります。
これがあなたの場合にも当てはまる場合、考えられるすべての原因は次のとおりです。
どちらか一方を解決するには、次のアドバイスに従ってください。
ping
でそれらを検証およびテストします。my.cnf
_に基づいて検証します。--skip-networking
_オプションを使用せずにmysqldが開始されているかどうかを確認します。ちなみに(実際の問題とは無関係に)、JDBCドライバーを必ずしもeverygetConnection()
にロードする必要はありません。コール。起動時に一度だけで十分です。
dBサーバーで設定された待機タイムアウトを確認してください。場合によっては、デフォルトで10秒になります。これにより、10秒で接続が失われます。
mysql> show global variables like '%time%' ;
それを更新して28800のようなものにします
mysql> SET GLOBAL wait_timeout = 28800;
同じエラーが発生しましたが、その時点でMysqlサーバーが実行されていないであるため、それを把握しました。
サーバーのステータスを変更するには
これが役立つことを願っています。
私も約8〜9日間この問題を抱えています。背景を以下に示します。bashで実行する単純なJavaアプリケーションを開発しています。
詳細:
[jvazquez @ archbox〜] $ mysql --version mysql Ver 14.14 Distrib 5.5.9、Linux(i686)for readline 5.1 Linux archbox 2.6.37-Arch#1 SMP PREEMPT Fri Feb 18 16:58:42 UTC 2011 i686 Intel(R)Core(TM)2 Quad CPU Q8200 @ 2.33GHz GenuineIntel GNU/Linux
このアプリケーションは、Arch Linux、Mac OS X 10.6、およびFreeBSD 7.2で正常に動作します。同じmysql、同じmy.cnf、および同じカーネルバージョンを使用して、jarファイルを別のホストの別のArch Linuxに移動すると、接続が切断され、元のポスターと同じエラーが発生しました。
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:通信リンク障害
私はこれとフォーラムで見つけたすべての可能な組み合わせを試しました( http://forums.mysql.com/read.php?39,180347,180347#msg-180347 たとえば、現在閉鎖されており、投稿できません..)、具体的には:
指摘されたように(同じ例外を検索すると、問題に関するいくつかのsoスレッドが見つかります Spring、hibernate、C3P0のセットアップでcom.mysql.jdbc.exceptions.jdbc4.CommunicationsExceptionを再現します 例えば)。
リンクが削除された場合は、mysqld:ALLを/etc/hosts.allowに追加するだけです
私はそれが少し拡張されていることを知っていますが、GNU/Linuxを使用してこの例外を持っている人を助けるかもしれません、このスレッドは私の研究を投稿するのに最適な場所に見えました。
それが役に立てば幸い
Apache commons接続プーリングを使用したソフトウェア(Tomcatを使用したwebapp)があり、長年にわたって機能していました。先月、古いバグが発生したため、ライブラリを更新する必要がありました。このバグは最近のバージョンで修正されました。
これを展開してすぐに、これらのメッセージを正確に取得し始めました。 1日に取得する数千の接続のうち、少数(通常は10未満)にこのエラーメッセージが表示されます。実際のパターンはありませんでしたが、2〜5の小さなグループにクラスター化される場合がありました。
プールでオプションを変更して、プールから接続を取得するか、プールに戻すたびに接続を検証し(問題が見つかった場合は、代わりに新しい接続が生成されます)、問題はなくなりました。
MySQL jarを最近更新しましたか?私たちの(確かに非常に古い)jarに存在していなかった新しい設定があるかもしれません。
(接続タイムアウトに加えて)MySQLに渡すオプションなど、設定で他のオプションを試すことにBalusCに同意します。
この障害が永続的ではなく一時的なものである場合、単純なtry/catchとループを使用して、成功するまで試行を続けるか、接続プールを使用してその詳細を処理できます。
他のランダムなアイデア:閉じた接続を使用しようとするとどうなるかわかりません(この例外が発生します)。どこかで接続を誤って閉じてしまう可能性はありますか?
スキップネットワーキングがmy.cnf/my.iniでコメント化されていることを確認します
BalusCが述べたように、fullスタックトレースを投稿することは非常に便利です(常に完全なスタックトレースを投稿します。スタックトレースの)。
とにかく、あなたはあなたのコードが正常に機能していることと、この問題がコードの変更なしで突然発生し始めたことに言及したので、これが関連しているのではないかと思っていますあなたに他の質問 デバッグ中にdb接続を閉じない問題? 実際、デバッグ中にこの問題が始まった場合、それは(接続を使い果たした)と思います。その場合は、データベースサーバーを再起動します(この状況を回避するには、他の質問の提案に従ってください)。
同じ問題が発生しました。 spring&dbcp&mysql 5.5を使用していますが、localhost
を192.168.1.110
に変更すると、すべてが機能します。物事をより奇妙にするのは、mysql -h localhost
がうまく機能することです。
更新:最終的に解決策を見つけました。 bindaddressを127.0.0.1
のlocalhost
またはmy.conf
に変更すると、問題が修正されます。
私の場合、ローカルループバックインターフェイスは開始されていなかったため、「localhost」を解決できませんでした。これを確認するには、「ifconfig」を実行します。「lo」というインターフェイスが表示されます。起動していない場合は、「ifup lo」または「ifconfig lo up」を実行してアクティブ化できます。
重大な問題は、Mysql JDBCプール接続が使用されていないことです。その後、Mysqlからのタイムアウトにより、接続が閉じられます。この方法で、接続に障害が発生したときに再起動接続を取得するには、プールのパラメーターを変更する必要があります。
Connection Validation
:必須(チェック)Validation Method:
自動コミット
機能しない場合は、検証方法を変更できます!
特定のステートメントでJava.sql.PreparedStatementを使用すると、通信障害エラーが発生しました。
これは、Windows 7 x64マシン上のMySQL 5.6、Tomcat 7.0.29およびJDK 1.7.0_67に対して実行されていました。
原因は、整数を文字列パラメーターに設定し、文字列を整数パラメーターに設定してから、準備されたステートメントでexecuteQueryを実行しようとしたことが判明しました。パラメーター設定の順序を修正した後、ステートメントは正しく実行されました。
エラーメッセージの文言が示唆するように、これはネットワークの問題とは関係ありませんでした。
リモートホストに接続しているようです。ここでの質問は、インターネットへの接続にどのタイプのネットワークを使用していますか?
[〜#〜] windows [〜#〜]
モバイルブロードバンドデバイスの場合、マシンのIPアドレスを取得してホストサーバーに追加し、ホストサーバーがマシンからの接続を許可できるようにします。 [セキュリティ上の理由により、ホストがこれをオフにしている可能性があります]。異なるネットワークデバイスを使用するたびに、IPが変わることに注意してください。
LANを使用している場合は、マシンに静的IPアドレスを設定してから、ホストに追加します。
これがお役に立てば幸いです!! :)
私の場合、mysql.comがConnector/J 5.1.29 .jarをダウンロードするとこのエラーが発生しましたに対して、MvnRepositoryからダウンロードした5.1.29 .jarはダウンロードできませんでしたです。
これは、Android Studio(gradle、Windows x64))でGoogle appengineアプリケーションを構築し、ローカルネットワーク/ローカルVM上のLinux MySQLサーバーと通信するときに発生しました。
私は同じ問題を抱えていて、ほとんどのパラメータ(自動再接続など)を使用しましたが、(test_on_idleまたはtest_on_connect)を試しませんでした。次にそれらを行います。
しかし、私はこれを介して私を導いたこのハックを持っていました:
Healthcheckというcronジョブがあります。10分ごとに起動し、REST= API呼び出しをサーバーに行います。Web/アプリサーバーはこれを選択し、dbに接続し、変化し、「西部戦線ではすべてはい」または「たわごと」で戻ってきます。後者の場合、ページャー/電子メールを適切な人に送信します。
データベース接続プールを常に最新の状態に保つという副作用があります。このcronが実行されている限り、db接続タイムアウトの問題はありません。そうでない場合、それらは切り取られます。
WAMPを使用する場合は、それがオンラインであることを確認してください。私がやったことは、最初にファイアウォールをオフにしてから動作したため、その後、すべてのローカルポート、特にポート80の接続を許可しました。この問題を取り除きました。私にとっては、接続をブロックしていたのはファイアウォールでした。