web-dev-qa-db-ja.com

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:通信リンク障害

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;
}
43
Nick Heiner

これはラップされた例外であり、あまり興味深いものではありません。根本原因について実際に何かを伝えるのは、例外の根本原因です。スタックトレースをもう少し見てください。その後、_SQLException: Connection refused_または_SQLException: Connection timed out_に直面する可能性が高くなります。

これがあなたの場合にも当てはまる場合、考えられるすべての原因は次のとおりです。

  1. JDBC URLのIPアドレスまたはホスト名が間違っています。
  2. JDBC URLのホスト名は、ローカルDNSサーバーによって認識されません。
  3. JDBC URLにポート番号が欠落しているか間違っています。
  4. DBサーバーがダウンしています。
  5. DBサーバーはTCP/IP接続を受け入れません。
  6. JavaとDBが接続をブロックしていること(ファイアウォールやプロキシなど)。

どちらか一方を解決するには、次のアドバイスに従ってください。

  1. pingでそれらを検証およびテストします。
  2. DNSを更新するか、JDBC URLで代わりにIPアドレスを使用してください。
  3. MySQL DBの_my.cnf_に基づいて検証します。
  4. 始めよう。
  5. _--skip-networking_オプションを使用せずにmysqldが開始されているかどうかを確認します。
  6. ファイアウォールを無効にするか、ポートを許可/転送するようにファイアウォール/プロキシを構成します。

ちなみに(実際の問​​題とは無関係に)、JDBCドライバーを必ずしもeverygetConnection()にロードする必要はありません。コール。起動時に一度だけで十分です。

37
BalusC

dBサーバーで設定された待機タイムアウトを確認してください。場合によっては、デフォルトで10秒になります。これにより、10秒で接続が失われます。

mysql> show global variables like '%time%' ;

それを更新して28800のようなものにします

mysql> SET GLOBAL wait_timeout = 28800;
12
sujit sathe

同じエラーが発生しましたが、その時点でMysqlサーバーが実行されていないであるため、それを把握しました。

サーバーのステータスを変更するには

  1. タスクマネージャーに移動
  2. サービスに移動
  3. 次に、MySQLサーバーを検索します(例:私の場合はMYSQL56)
  4. ステータス列の下に、実行されていないと表示されます
  5. 右クリックして、開始を選択します

これが役立つことを願っています。

5
Rahal Kanishka

私も約8〜9日間この問題を抱えています。背景を以下に示します。bashで実行する単純なJavaアプリケーションを開発しています。

詳細:

  • 春2.5.6
  • Hibernate3.2.3.ga
  • Mavenを使用します。 (プロジェクトのベースはmkyong.comで、注釈のない春のチュートリアルです)
  • MySQLバージョン:
[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 たとえば、現在閉鎖されており、投稿できません..)、具体的には:

  • スキップネットワークを使用していないことをトリプルチェックします。 (ps auxおよびmy.cnfで検証済み)
  • My.cnfでlog_warnings = 1を有効にしようとしましたが、明らかに、サーバーにアクセスしていないため、アプリの使用中に何も表示されませんでした
  • SHOW ENGINE innodb STATUSは何も表示しませんでした。テスト中にシェル経由で接続でき、phpもmysqlサーバーに接続できました
  • / etc/hostsにはlocalhost 127.0.0.1があります
  • Localhostおよび127.0.0.1を使用してjdbcプロパティを試行しましたが、結果はありませんでした
  • C3p0の追加を試み、max_waitを変更しました
  • My.cnfの最大接続数は900、2000に変更されましたが、まだ何もありませんmy.cnf
  • 追加されたwait_timeout = 60my.cnf
  • 追加されたnet_wait_timeout = 360my.cnf
  • Destroy-method = "close"spring.xmlを追加しました

指摘されたように(同じ例外を検索すると、問題に関するいくつかのsoスレッドが見つかります Spring、hibernate、C3P0のセットアップでcom.mysql.jdbc.exceptions.jdbc4.CommunicationsExceptionを再現します 例えば)。

  1. Tomcatを使用している場合は、セキュリティの例外を確認してください(もう一度、SOにあります。見つけるでしょう)。
  2. 使用しているURLを解決できることを確認してください
  3. C3p0を追加してみてください。
  4. 接続を拒否するファイアウォールがないことを確認します
  5. 最後に、GNU/Linuxを使用している場合(たとえばArch Linuxで、実際にこの例外を取得する場合)試してください MySQLフォーラム:: JDBCおよびJava :: EOFException:応答を読み取れませんサーバーから。4バイトの読み取りが予想され、予期せず接続が失われる前に0バイトが読み取られました

リンクが削除された場合は、mysqld:ALLを/etc/hosts.allowに追加するだけです

私はそれが少し拡張されていることを知っていますが、GNU/Linuxを使用してこの例外を持っている人を助けるかもしれません、このスレッドは私の研究を投稿するのに最適な場所に見えました。

それが役に立てば幸い

4

Apache commons接続プーリングを使用したソフトウェア(Tomcatを使用したwebapp)があり、長年にわたって機能していました。先月、古いバグが発生したため、ライブラリを更新する必要がありました。このバグは最近のバージョンで修正されました。

これを展開してすぐに、これらのメッセージを正確に取得し始めました。 1日に取得する数千の接続のうち、少数(通常は10未満)にこのエラーメッセージが表示されます。実際のパターンはありませんでしたが、2〜5の小さなグループにクラスター化される場合がありました。

プールでオプションを変更して、プールから接続を取得するか、プールに戻すたびに接続を検証し(問題が見つかった場合は、代わりに新しい接続が生成されます)、問題はなくなりました。

MySQL jarを最近更新しましたか?私たちの(確かに非常に古い)jarに存在していなかった新しい設定があるかもしれません。

(接続タイムアウトに加えて)MySQLに渡すオプションなど、設定で他のオプションを試すことにBalusCに同意します。

この障害が永続的ではなく一時的なものである場合、単純なtry/catchとループを使用して、成功するまで試行を続けるか、接続プールを使用してその詳細を処理できます。

他のランダムなアイデア:閉じた接続を使用しようとするとどうなるかわかりません(この例外が発生します)。どこかで接続を誤って閉じてしまう可能性はありますか?

3
MBCook

スキップネットワーキングがmy.cnf/my.iniでコメント化されていることを確認します

3
PorridgeBear

BalusCが述べたように、fullスタックトレースを投稿することは非常に便利です(常に完全なスタックトレースを投稿します。スタックトレースの)。

とにかく、あなたはあなたのコードが正常に機能していることと、この問題がコードの変更なしで突然発生し始めたことに言及したので、これが関連しているのではないかと思っていますあなたに他の質問 デバッグ中にdb接続を閉じない問題? 実際、デバッグ中にこの問題が始まった場合、それは(接続を使い果たした)と思います。その場合は、データベースサーバーを再起動します(この状況を回避するには、他の質問の提案に従ってください)。

2
Pascal Thivent

同じ問題が発生しました。 spring&dbcp&mysql 5.5を使用していますが、localhost192.168.1.110に変更すると、すべてが機能します。物事をより奇妙にするのは、mysql -h localhostがうまく機能することです。

更新:最終的に解決策を見つけました。 bindaddressを127.0.0.1localhostまたはmy.confに変更すると、問題が修正されます。

1
LiuJian

私の場合、ローカルループバックインターフェイスは開始されていなかったため、「localhost」を解決できませんでした。これを確認するには、「ifconfig」を実行します。「lo」というインターフェイスが表示されます。起動していない場合は、「ifup lo」または「ifconfig lo up」を実行してアクティブ化できます。

0

重大な問題は、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を実行しようとしたことが判明しました。パラメーター設定の順序を修正した後、ステートメントは正しく実行されました。

エラーメッセージの文言が示唆するように、これはネットワークの問題とは関係ありませんでした。

0
Will Marsh

リモートホストに接続しているようです。ここでの質問は、インターネットへの接続にどのタイプのネットワークを使用していますか?

[〜#〜] windows [〜#〜]

モバイルブロードバンドデバイスの場合、マシンのIPアドレスを取得してホストサーバーに追加し、ホストサーバーがマシンからの接続を許可できるようにします。 [セキュリティ上の理由により、ホストがこれをオフにしている可能性があります]。異なるネットワークデバイスを使用するたびに、IPが変わることに注意してください。

LANを使用している場合は、マシンに静的IPアドレスを設定してから、ホストに追加します。

これがお役に立てば幸いです!! :)

0
21stking

私の場合、mysql.comがConnector/J 5.1.29 .jarをダウンロードするとこのエラーが発生しましたに対して、MvnRepositoryからダウンロードした5.1.29 .jarはダウンロードできませんでしたです。

これは、Android Studio(gradle、Windows x64))でGoogle appengineアプリケーションを構築し、ローカルネットワーク/ローカルVM上のLinux MySQLサーバーと通信するときに発生しました。

0
mstrthealias

私は同じ問題を抱えていて、ほとんどのパラメータ(自動再接続など)を使用しましたが、(test_on_idleまたはtest_on_connect)を試しませんでした。次にそれらを行います。

しかし、私はこれを介して私を導いたこのハックを持っていました:

Healthcheckというcronジョブがあります。10分ごとに起動し、REST= API呼び出しをサーバーに行います。Web/アプリサーバーはこれを選択し、dbに接続し、変化し、「西部戦線ではすべてはい」または「たわごと」で戻ってきます。後者の場合、ページャー/電子メールを適切な人に送信します。

データベース接続プールを常に最新の状態に保つという副作用があります。このcronが実行されている限り、db接続タイムアウトの問題はありません。そうでない場合、それらは切り取られます。

0
Sree

WAMPを使用する場合は、それがオンラインであることを確認してください。私がやったことは、最初にファイアウォールをオフにしてから動作したため、その後、すべてのローカルポート、特にポート80の接続を許可しました。この問題を取り除きました。私にとっては、接続をブロックしていたのはファイアウォールでした。

0