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


17

標準の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)

これは、外部から接続しようとした場合と同じ問題のようです。


LAN内の別のサーバーで実行されるmysqlデータベースにjavaを介して接続しようとすると、この問題に直面しました。mysqlを実行するサーバーで同じjavaプログラムを実行すると、問題なく接続していました。外部マシンから、たとえばSQLYogを使用してmysqlデータベースに接続できました(ただし、my.cnfファイルを127.0.0.1ではなく0.0.0.0にバインドするように最初に変更する必要がありました)。ボーデンの答えとJDBCコネクタの変更に関するコメントは、正しい方向を示してくれました。JDBCコネクターを最新バージョンに変更すると、突然機能しました!
user2380870

回答:


18

これはさまざまな理由で発生します。私は数週間前に自分でそれを見たが、修正が私にとって何であったか覚えていない。

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でも)。


私の2セントを追加するために、4番目が機能しました。ありがとう!
ジャニスPeisenieks

1
「my.cnfのbind-addressパラメーターをコメントアウトして、使用可能なすべてのアドレスにバインドする必要がある」に関して、デフォルトではlocalhostでのみリッスンするため、「bind-address = 0.0」の行を使用する必要があります。 [mysqld]内に0.0 "。
パロ

13

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の設定を変更する必要があるソリューションについては、次を参照することはできません。

  • Linux:/etc/my.cnf

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

ソリューションは次のとおりです。

  • 「バインドアドレス」属性の変更

「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_pa​​cketを変更しないでください

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

  • Tomcatセキュリティを変更する

TOMCAT6_SECURITY = yesをTOMCAT6_SECURITY = noに変更します

  • validationQueryプロパティを使用

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

  • 自動再接続

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

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

これらのソリューションはどれも私にとってはうまくいきませんでしたが、試してみることをお勧めします。これらの手順に従うことで問題をどのように解決したかという人がいるからです。

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

結論

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


私もこの問題を抱えていました!しかし、最初はmysqlを3306の代わりにポート8888をリッスンするように変更していました。たくさんありがとう

これで問題は解決しました!Vagrant Homesteadのセットアップでは、何らかの理由で、localhostの代わりにVMに与えられたアドレス(私の場合は10.0.2.15)にバインドしていました。
着陸

1

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

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

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


Ubuntu 8.04を実行しています。おそらく言及したはずです。そのディストリビューションの具体的な手順はありますか?すぐにグーグルで検索しますが、最初に質問したいと思いました。
ステファンケンダル

sudo ufwを無効にするとUbuntuファイアウォールが無効になります
スティーブントンプソン

ufwをインストールし、ポートを有効にしようとしましたが、サイコロはありません。
ステファンケンドール

ufwとiptablesはすでにアンインストールされています。ufwは、個別にインストールする必要がある管理ツールだと思いました。案の定、「iptables」はそのようなコマンドを生成せず、iptablesサービスは実行されていないようです。
ステファンケンドール

最後に、私がよく見つけたのは、mysqlがeth0インターフェイスでリッスンできないようにすることです。多くの場合、localhostインターフェイスでのみリッスンします。以下を試してください。jdbc:mysql://myserver.com:myport / mydbをjdbc:mysql:// localhost:myport / mydbに変更します。それが機能する場合は、次のdev.mysql.com/doc/refman/5.1/en/
スティーブントンプソン


1

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


1

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

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


0

私はほぼ1日非常に似たような問題を抱えていたので、それは私を夢中にさせました!しかし、私はなんとか解決策を見つけました。非常に簡単で、/ etc / init.d / tomcat6でTOMCAT6_SECURITY = yesをTOMCAT6_SECURITY = noに変更するだけです。それは私の解決策ではありません、私はここでそれを見つけまし、あなたが見ることができるように、私はubuntuを実行しています、これがうまくいくことを願っています。


0

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

バインドアドレス= 0.0.0.0

サーバーの外部IPアドレスに設定される前は、次のようになりました。

バインドアドレス= 196.152.4.145

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


0

ローカルアドレスを試して、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();
    }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.