web-dev-qa-db-ja.com

リモートデータベースへの「com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:Communications link failure」

リモートのMySQLデータベースに接続しようとしましたが、失敗してこのエラーが発生しました。

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

混乱は、MySQL-Frontツールを使用してリモートデータベースに接続したときに効果的であり、IPアドレスに正常にpingできることです。しかし、コードを使用すると、約10秒後にエラーが表示されます。

また、コードで間違ったユーザー名またはパスワードを使用した場合、すぐに間違った検証が表示されます。それは接続を設定することは問題がないことを証明しましたか?

これが私のコードです(私のローカルホストデータベースで動作します):

public static void main(String[] args) {
        String url = "jdbc:mysql://(IP address):3306/";
        String dbName = "talk";
        String driver = "com.mysql.jdbc.Driver";
        String userName = "talkroot";
        String password = "123456";
        try {
            Class.forName(driver).newInstance();
            Connection conn = DriverManager.getConnection(url + dbName,
                    userName, password);
            System.out.println("connect");
            conn.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("end");
    }

ここにエラーがあります:

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

Last packet sent to the server was 0 ms ago.
    at Sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at Sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    at Sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
    at Java.lang.reflect.Constructor.newInstance(Unknown Source)
    at com.mysql.jdbc.Util.handleNewInstance(Util.Java:406)
    at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.Java:1074)
    at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.Java:2120)
    at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.Java:723)
    at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.Java:46)
    at Sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at Sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    at Sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
    at Java.lang.reflect.Constructor.newInstance(Unknown Source)
    at com.mysql.jdbc.Util.handleNewInstance(Util.Java:406)
    at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.Java:302)
    at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.Java:282)
    at Java.sql.DriverManager.getConnection(Unknown Source)
    at Java.sql.DriverManager.getConnection(Unknown Source)
    at com.test.TestMySQL.main(TestMySQL.Java:16)
Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

Last packet sent to the server was 21298 ms ago.
    at Sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at Sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    at Sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
    at Java.lang.reflect.Constructor.newInstance(Unknown Source)
    at com.mysql.jdbc.Util.handleNewInstance(Util.Java:406)
    at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.Java:1074)
    at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.Java:3009)
    at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.Java:2895)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.Java:3438)
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.Java:1951)
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.Java:2101)
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.Java:2548)
    at com.mysql.jdbc.ConnectionImpl.configureClientCharacterSet(ConnectionImpl.Java:1802)
    at com.mysql.jdbc.ConnectionImpl.initializePropsFromServer(ConnectionImpl.Java:3444)
    at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.Java:2062)
    ... 12 more
Caused by: Java.net.SocketException: Software caused connection abort: recv failed
    at Java.net.SocketInputStream.socketRead0(Native Method)
    at Java.net.SocketInputStream.read(Unknown Source)
    at Java.net.SocketInputStream.read(Unknown Source)
    at com.mysql.jdbc.util.ReadAheadInputStream.fill(ReadAheadInputStream.Java:113)
    at com.mysql.jdbc.util.ReadAheadInputStream.readFromUnderlyingStreamIfNecessary(ReadAheadInputStream.Java:160)
    at com.mysql.jdbc.util.ReadAheadInputStream.read(ReadAheadInputStream.Java:188)
    at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.Java:2452)
    at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.Java:2906)
    ... 20 more

誰でも私を助けてくれますか?

9
chenupt

このcom.mysql.jdbc.exceptions.jdbc4.CommunicationsException例外は、データベース接続が長時間アイドル状態である場合に発生します。このアイドル接続は、connection.isClosed()でtrueを返します。しかし、ステートメントを実行しようとすると、この例外が発生するので、データベースプーリングを使用することをお勧めします。

3
Yogesh Funde

通常、このエラーは正しいポート番号を使用しない場合に発生します。このデータベース(client'db)で作業しているマシンのポート番号が異なる可能性があります。 (例:3307)。
タスクマネージャー==>サービス==>サービスに移動し、mysqlの他のバージョンがあるかどうかを確認します。 3306を使用している場合は、ポートを3307に変更します。

2

ドライブのバージョンを次のように更新します。

<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-Java</artifactId>
<version>5.1.18</version>
1
Aleja Chica

接続URLからポート番号を削除して解決しました。

したがって、接続文字列を次のように使用する代わりに:

jdbc:mysql://12x.xxx.xxx.xxx:1527/yourdbname

使用する

jdbc:mysql://12x.xxx.xxx.xxx/yourdbname

1
sahu

MySQLサーバーが実行されていません。 Windowsを実行している場合は、タスクマネージャのサービスページでも同じことを確認してください。

1

mysql-connector-Java-version.jar jarファイルを置き換えてみてください。一部の人々はjarファイルを5.1.10から5.1.14に更新し、それが機能します。幸運を祈ります。

1
Jingyuan Liu

次のことを再確認します。

  • IPアドレス/ポート番号が正しいかどうかを確認します
  • Ping "IPアドレス"を使用してサーバーにpingすると、サーバーが起動モード/シャットダウンモードであることが通知される場合があります。
  • 接続プールから接続オブジェクトを取得している場合は、接続の可用性を1回確認します。

この情報がお役に立てば幸い...

1
Ram72119

また、コードで間違ったユーザー名またはパスワードを使用した場合、すぐに間違った検証が表示されます。それは接続を設定することは問題がないことを証明しましたか?

これはおそらくローカルで行われます。そのため、コードが機能しない理由とは関係ありません。

これには多くの方法があるようですので、複数のことを試すことができます。人々はこのリンク障害を自分の状況ごとにさまざまな方法で解決しました:

ここにいくつかの解決策があります:

  • 「bind-address」属性の変更

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

bind-address = "127.0.0.1"

または

bind-address = "0.0.0.0"

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

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

  • 「wait_timeout」と「interactive_timeout」を変更

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

[wait_timeout] [1] =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] [4]」は、MySQL構成ファイルの変数であり、最大パケット数ではなく、最大パケットサイズを示します。したがって、このエラーの解決には役立ちません。

  • Tomcatセキュリティを変更

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

  • validationQueryプロパティを使用

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

  • 自動再接続

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

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

/etc/mysql/my.cnfファイルのmysql設定ファイルを更新してください

デフォルトでは、MySQLはlocalhostアドレスからの接続のみを許可します。設定ファイルは通常/etc/mysql/my.cnfにあります

次のようにして、bind-address行をコメント化します。

#bind-address     = 127.0.0.1

次に、データベースサーバーを再起動する必要があります。

Sudo /etc/init.d/mysql restart
0
Noyal

Amazon Ubuntuインスタンスを使用している場合は、次の手順に従う必要があります。

  1. Amazonインスタンスを確認する
  2. インスタンスのセキュリティグループを確認する
  3. mysql/auraサービスを割り当て、ここにマシンipまたはサービスプロバイダーipを追加します。
0
shivamindalkar

私はこの問題に直面し、多くのように苦労しました。私はすべてのポータルで言われたことすべてを行い、私のために働いていませんでした。私に有効だったのは、jarファイルを現在の新しいバージョンに更新することだけでした。以前は5.1.38を使用していましたが、現在は8.0.15に更新されており、プログラムは非常にうまく機能しました。

0
Nandy