リモートの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
誰でも私を助けてくれますか?
このcom.mysql.jdbc.exceptions.jdbc4.CommunicationsException例外は、データベース接続が長時間アイドル状態である場合に発生します。このアイドル接続は、connection.isClosed()でtrueを返します。しかし、ステートメントを実行しようとすると、この例外が発生するので、データベースプーリングを使用することをお勧めします。
通常、このエラーは正しいポート番号を使用しない場合に発生します。このデータベース(client'db)で作業しているマシンのポート番号が異なる可能性があります。 (例:3307)。
タスクマネージャー==>サービス==>サービスに移動し、mysqlの他のバージョンがあるかどうかを確認します。 3306を使用している場合は、ポートを3307に変更します。
ドライブのバージョンを次のように更新します。
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-Java</artifactId>
<version>5.1.18</version>
接続URLからポート番号を削除して解決しました。
したがって、接続文字列を次のように使用する代わりに:
jdbc:mysql://12x.xxx.xxx.xxx:1527/yourdbname
使用する
jdbc:mysql://12x.xxx.xxx.xxx/yourdbname
MySQLサーバーが実行されていません。 Windowsを実行している場合は、タスクマネージャのサービスページでも同じことを確認してください。
mysql-connector-Java-version.jar jarファイルを置き換えてみてください。一部の人々はjarファイルを5.1.10から5.1.14に更新し、それが機能します。幸運を祈ります。
次のことを再確認します。
この情報がお役に立てば幸い...
また、コードで間違ったユーザー名またはパスワードを使用した場合、すぐに間違った検証が表示されます。それは接続を設定することは問題がないことを証明しましたか?
これはおそらくローカルで行われます。そのため、コードが機能しない理由とは関係ありません。
これには多くの方法があるようですので、複数のことを試すことができます。人々はこのリンク障害を自分の状況ごとにさまざまな方法で解決しました:
「bind-address」属性のコメントを外すか、次のIPのいずれかに変更します。
bind-address = "127.0.0.1"
または
bind-address = "0.0.0.0"
MySQL構成ファイルに「skip-networking」行がある場合は、その行の先頭に「#」記号を追加してコメント化します。
次の行を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サーバーのユーザー名とパスワードに変更することを忘れないでください。
「[max_allowed_packet] [4]」は、MySQL構成ファイルの変数であり、最大パケット数ではなく、最大パケットサイズを示します。したがって、このエラーの解決には役立ちません。
tomcat6_SECURITY = yesをTomcat6_SECURITY = noに変更します
validationQuery = "select now()"を使用して、各クエリに応答があることを確認します
次のコードを接続文字列に追加します。
&autoReconnect=true&failOverReadOnly=false&maxReconnects=10
/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
Amazon Ubuntuインスタンスを使用している場合は、次の手順に従う必要があります。
私はこの問題に直面し、多くのように苦労しました。私はすべてのポータルで言われたことすべてを行い、私のために働いていませんでした。私に有効だったのは、jarファイルを現在の新しいバージョンに更新することだけでした。以前は5.1.38を使用していましたが、現在は8.0.15に更新されており、プログラムは非常にうまく機能しました。