web-dev-qa-db-ja.com

Tomcatまたは外部からJDBCコネクタを介してmysqlに接続できない

ストックのmysql 5.5インストールをインストールしました。mysqlコマンドを介してmysqlサービスに接続でき、サービスが実行されているように見えますが、spring + Tomcatまたは外部のjdbcコネクタからは接続できません。

次のURLを使用しています。

jdbc:mysql://myserver.com:myport/mydb

適切なユーザー名/パスワードで、次のメッセージが表示されます:

server.com: 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.

そしてTomcatは投げます:

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.
    Sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    Sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.Java:57)

これは、外部接続しようとするのと同じ問題のようです。

17
Stefan Kendall

これはさまざまな理由で発生します。数週間前に自分で見ただけですが、何が修正されたか思い出せません。

1)mysqlがバインドされているアドレスを確認します。これはおそらく127.0.0.1(のみ)であり、これがデフォルトであると考えています(少なくとも標準のUbuntuサーバーでは)。使用可能なすべてのアドレスにバインドするには、my.cnfのbind-addressパラメータをコメント化する必要があります(複数を選択することはできません。1つまたはすべてを選択できます)。

2)127.0.0.1にバインドされていて、「localhost」を使用して接続できない場合は、IPv4ではなくIPv6 localhostアドレスに解決されていないことを確認してください。 (または単にIPアドレスを使用)

3)mysqlがリッスンしているポートをダブルおよびトリプルチェックします。

4)JDKに適切なJDBCコネクターを使用していることを確認してください。

5)--skip-networkingでmysqlを起動するような愚かなことをしていないことを確認してください。

私の最初の提案が最も有望だと思います...実際、私はそれを最近見たところだと思います...リモートでmysqlに接続しようとしていました(Ubuntu 8.04でも)。

18
Boden

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/my.cnf

  • Windows:D:\ Program Files\mysql\bin\my.ini

ここに解決策があります:

  • 「bind-address」属性の変更

「bind-address」属性のコメントを外すか、次のいずれかのIPに変更します。

bind-address = "127.0.0.1"

または

bind-address = "0.0.0.0"

  • 「skip-networking」をコメントアウト

MySQL構成ファイルに「skip-networking」行がある場合は、その行の先頭に「#」記号を追加してコメント化します。

  • change "wait_timeout" and "interactive_timeout"

次の行をMySQL構成ファイルに追加します。

wait_timeout =number

interactive_timeout =number

connect_timeout =number

  • オペレーティングシステムのプロキシ設定を確認してください

ファイアウォール、またはウイルス対策ソフトウェアが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_pa​​cketは変更しないでください

" max_allowed_pa​​cket "は、パケットの最大数ではなく、最大パケットサイズを示すMySQL構成ファイルの変数です。したがって、このエラーの解決には役立ちません。

  • Tomcatセキュリティの変更

tomcat6_SECURITY = yesをTomcat6_SECURITY = noに変更します

  • validationQueryプロパティを使用します

validationQuery = "select now()"を使用して、各クエリに応答があることを確認します

  • AutoReconnect

次のコードを接続文字列に追加します。

&autoReconnect=true&failOverReadOnly=false&maxReconnects=10

これらの解決策はどれも私にとってはうまくいきませんでしたが、それらを試すことをお勧めします。何人かの人々がこれらのステップに従うことで彼らの問題を解決したからです。

しかし、何が私の問題を解決しましたか?私の問題は、データベースに多くのSELECTがあることでした。接続を作成して閉じるたびに。毎回接続を閉じましたが、システムは多くの接続に直面し、そのエラーを出しました。私がしたことは、接続変数をクラス全体のパブリック(またはプライベート)変数として定義し、コンストラクターで初期化することでした。次に、その接続を使用するたびに。それは私の問題を解決し、私の速度を劇的に向上させました。

結論

この問題を解決する簡単でユニークな方法はありません。自分の状況を考え、上記の解決策を選択することをお勧めします。プログラムの開始時にこのエラーが発生し、データベースにまったく接続できない場合は、接続文字列に問題がある可能性があります。しかし、データベースへのいくつかの正常な相互作用の後にこのエラーが発生する場合、問題は接続数にある可能性があり、「wait_timeout」およびその他のMySQL設定の変更を検討するか、接続数を減らす方法をコードに書き直すことができます。

13
Soheil

これは、誤ったプロキシ設定が原因である場合もあります。 MacのParallels仮想アプライアンスで実行されているMySQLインスタンスにjdbc経由で接続しようとしてこの問題が発生しました。 jdbc接続はシステムレベルのネットワーク設定を使用し、SOCKSプロキシの背後にいるのでMySqlホストを非プロキシホストとして設定(たとえば、Macでは設定で構成できます) -> [ネットワーク]-> [詳細設定]-> [プロキシ]をクリックし、最後に「これらのホストとドメインのプロキシ設定をバイパスする」にホスト名またはIPアドレスを追加します。

1
Simone Bruno

MySQL Connector/JはTCP/IPのみをサポートしますJavaはUnixドメインソケット接続をサポートしません

MYSQLがskip-networkingフラグで開始されている場合、またはMySQLがファイアウォールの背後で実行されている場合、TCP/IPオプションは無効になります。つまり、JavaはMySQLと通信できません。

1
Sankar.lp.gym

Linuxインストールを実行している場合は、SSH経由以外の着信通信をブロックするlokkitを使用している可能性があります。

Rootとしてログインし、プロンプトからlokkitコマンドを実行し、ファイアウォールとSElinuxを無効にして、同じ問題が発生するかどうかを確認します。

また、権限が正しく設定されていることを確認してください。これにより、すべてが正しい場所に書き込むことができます。

1

Mysql-jdbcドライバのバージョン5.1.9にもこの大きなバグがあります。

http://bugs.mysql.com/bug.php?id=47494

1
Mathieu

同じ問題がありました。 /etc/mysql/my.cnfファイルの「bind-address」プロパティを0.0.0.0に変更すると、機能します。 my.cnfの対応する行は次のようになります。

bind-address = 0.0.0.0

サーバーの外部IPアドレスに設定される前は、次のようになっています。

bind-address = 196.152.4.145

Localhostループではなく外部IPアドレスに設定されている場合、mysqlサーバーはネットワークカードに接続されているだけで、ローカルループからの接続をリッスンしないと思います。

0
user56399

ほぼ1日間、非常によく似た問題が発生しました。しかし、私はなんとか解決策を見つけました。それは非常に簡単でした。Tomcat6_SECURITY= yesをTomcat6_SECURITY = noに変更するには、/ etc/init.d/Tomcat6を実行するだけです。それは私の解決策ではありません、私はそれを見つけました- ここ 、ご覧のとおり、私はubuntuを実行しています、これがうまくいくことを願っています。

0
comanitza

ローカルアドレスを試して、my.cnfファイルのアドレスをバインドします。

接続con = null;

    try {
        Class.forName("com.mysql.jdbc.Driver");
        con = DriverManager.getConnection("jdbc:mysql://x62.xx8.x4x.x5:3306/mydb", "root", "root");
        try {
            System.out.println(con.getMetaData());
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    } catch (ClassNotFoundException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
0
ozgun bayrak