web-dev-qa-db-ja.com

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

私は自分のデータベースが私のJavaプログラムと通信できるようにすることに取り組んでいます。

JDBCを使って、すばやく汚いサンプルプログラムを教えてもらえますか。

私はかなり厄介なエラーを受けています。

Exception in thread "main" 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.
    at Sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at Sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.Java:39)
    at Sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.Java:27)
    at Java.lang.reflect.Constructor.newInstance(Constructor.Java:513)
    at com.mysql.jdbc.Util.handleNewInstance(Util.Java:409)
    at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.Java:1122)
    at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.Java:2260)
    at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.Java:787)
    at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.Java:49)
    at Sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at Sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.Java:39)
    at Sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.Java:27)
    at Java.lang.reflect.Constructor.newInstance(Constructor.Java:513)
    at com.mysql.jdbc.Util.handleNewInstance(Util.Java:409)
    at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.Java:357)
    at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.Java:285)
    at Java.sql.DriverManager.getConnection(DriverManager.Java:582)
    at Java.sql.DriverManager.getConnection(DriverManager.Java:207)
    at SqlTest.main(SqlTest.Java:22)
Caused by: 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.
    at Sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at Sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.Java:39)
    at Sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.Java:27)
    at Java.lang.reflect.Constructor.newInstance(Constructor.Java:513)
    at com.mysql.jdbc.Util.handleNewInstance(Util.Java:409)
    at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.Java:1122)
    at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.Java:344)
    at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.Java:2181)
    ... 12 more
Caused by: Java.net.ConnectException: Connection refused
    at Java.net.PlainSocketImpl.socketConnect(Native Method)
    at Java.net.PlainSocketImpl.doConnect(PlainSocketImpl.Java:333)
    at Java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.Java:195)
    at Java.net.PlainSocketImpl.connect(PlainSocketImpl.Java:182)
    at Java.net.SocksSocketImpl.connect(SocksSocketImpl.Java:432)
    at Java.net.Socket.connect(Socket.Java:529)
    at Java.net.Socket.connect(Socket.Java:478)
    at Java.net.Socket.<init>(Socket.Java:375)
    at Java.net.Socket.<init>(Socket.Java:218)
    at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.Java:256)
    at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.Java:293)
    ... 13 more

テストファイルの内容

import com.mysql.jdbc.*;
import Java.sql.Connection;
import Java.sql.DriverManager;
import Java.sql.PreparedStatement;
import Java.sql.ResultSet;
import Java.sql.SQLException;
import Java.sql.Statement;

public class SqlTest {

    public static void main(String [] args) throws Exception {
        // Class.forName( "com.mysql.jdbc.Driver" ); // do this in init
        // // edit the jdbc url 
        Connection conn = DriverManager.getConnection( 
            "jdbc:mysql://localhost:3306/projects?user=user1&password=123");
        // Statement st = conn.createStatement();
        // ResultSet rs = st.executeQuery( "select * from table" );

        System.out.println("Connected?");
    }
}
180
Josh K

だから、あなたは持っています

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:通信リンク障害
Java.net.ConnectException:接続が拒否されました

私は この答え から引用しています。これには、段階的なMySQL + JDBCチュートリアルも含まれています。

SQLException: Connection refusedConnection timed out、またはMySQL固有のCommunicationsException: Communications link failureを取得した場合は、DBにアクセスできないことを意味します。これには、以下の1つ以上の原因が考えられます。

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

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

  1. それらをpingで検証してテストします。
  2. 代わりにDNSを更新するか、JDBC URLでIPアドレスを使用してください。
  3. MySQL DBのmy.cnfに基づいて確認してください。
  4. DBを起動します。
  5. Mysqldが--skip-networking optionなしで起動されているか確認してください。
  6. DBを再起動し、それに応じてコードを修正して、finally内の接続を閉じます。
  7. ファイアウォールを無効にするか、ポートを許可/転送するようにファイアウォール/プロキシを設定してください。

また見なさい:

218
BalusC

これが最善の解決策です。

 Connection con = DriverManager.getConnection(
 "jdbc:mysql://localhost:3306/DBname", "root", "root");

 Connection con = DriverManager.getConnection(
 "jdbc:mysql://192.100.0.000:3306/DBname", "root", "root");

あなたのIPアドレスへのLocalhostの置き換え

8
sureshAngamuthu

Javaがヒープ不足になると、この例外が発生します。 RAM個のデータ項目を入力しようとすると、最初に "通信リンクの障害"、次に "OutOfMemoryError "#:。

私はそれをログに記録しました、そして私はメモリ消費を減らし(1/2データを削除する)そしてすべて大丈夫です。

8
user1694306

データベース接続が長時間アイドル状態になっていると、このcom.mysql.jdbc.exceptions.jdbc4.CommunicationsException例外が発生します。

このアイドル接続はconnection.isClosed();でtrueを返しますが、ステートメントを実行しようとするとこの例外が発生するので、データベースプールを使用することをお勧めします。

7
Yogesh Funde

私は何時間も同じ問題を抱えています。 MAMPサーバーを使っています

Localhost:[Apache Port]の代わりにMySQLポートを使用してください。

以下はMAMPサーバ用のデフォルトMySQLポートです。

String url = "jdbc:mysql://localhost:8889/db_name";

Connection conn = DriverManager.getConnection(url, dbUsername, dbPassword);
5

私はここで間違った木を吠えているかもしれませんが、あなたの例外はあなたのMySQLサーバが利用できないことを示しているようです。

スレッド "main"の例外com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:通信リンクの失敗サーバーに正常に送信された最後のパケットは0ミリ秒前です。ドライバはサーバからパケットを受信して​​いません。で...

(端末から)試すとどうなりますか

mysql -u username -p

ユーザー名に関連付けられているパスワードの入力を求められます。正しいパスワードを入力すると、mysqlクライアントは接続しますか?

そうでない場合は、プリファレンスからMySQLを起動する必要があります。起動時に実行するように設定することもできます。

5
Karl Walsh

私の場合は、mysql-connector-Javaのバージョンが古すぎるということがわかりました。

私のデモでは、私はどういうわけかこのようにmysql-connector-Javaを使います:

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-Java</artifactId>
    <version>5.1.9</version>
</dependency>

しかし、開発環境では、これを使用します。

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-Java</artifactId>
    <version>5.1.31</version>
</dependency>

そして私のMySQLバージョンは5.1.48でした(はい、それは製品バージョンをまねるためだけに古いです)。だから私は同じエラーに会った。

その理由がわかったので、解決策も見つけました。バージョンを合わせてください!

5
shellbye

以前の答えが適切です。しかし、私はまた、より一般的な問題にも注目したいと思います。

私は同様の問題に直面しました、そして、その理由は私の会社のネットワーク制限でした。

私が他のネットワークにいるときも、同じ接続が成功していました。

4
user3251882

/etc/mysql/my.cnfファイルのIPアドレスを更新してください

bind-address  = <IP_ADDRESS>

Mysqlデーモンとmysqlサービスを再起動します。

4
Sreedhar GS

私の同じ問題は、次の手順で解決されます。

  1. my.cnfに行く

    vi /etc/mysql/my.cnf

  2. バインドアドレスを変更する

    "#bind-address = 127.0.0.1"

  3. mySQLを再起動します。

    Sudo /etc/init.d/mysql restart

3
Haimei

MySQLサーバーを起動せずにプログラムを実行しようとしたため、同じエラーが発生しました。

MySQLサーバーを起動した後、すべてがうまくいった。

3
rs2012

MySQL-JDBC-Type-4-Treiber( 'mysql-connector-Java-5.1.11.Zip'からの 'my​​sql-connector-Java-5.1.11-bin.jar')を でダウンロードしてください。 MySQL

クラスパスにコンパイル時および実行時にドライバjarを含める必要があります。

Class.forName( "com.mysql.jdbc.Driver" ); // do this in init
// edit the jdbc url 
Connection conn = DriverManager.getConnection( "jdbc:mysql://MyDbComputerNameOrIP:3306/myDatabaseName", username, password );
Statement st = conn.createStatement();
ResultSet rs = st.executeQuery( "select * from table" );
3
stacker

MysqlデータベースのインストールにWAMPまたはXAMPサーバーを使用している場合それからmysqlサーバーを明示的に起動する必要があります。そうしないとデータベースとの接続中にcom.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failureが表示されます。

2
xrcwrn

ポートを変更した場合は、このようなエラーが発生します。「com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:Communications link failure」ポート番号を確認してください

2
Maheshkumar.V

私はこの問題を簡単な方法で解決しました。私はseme問題 "com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:Communications link failure"を抱えていました。私のdb.propertiesファイルで私はこれを持っていた:url:jdbc:mysql:// localhost:90/myDB、ポートurlを削除しただけです。 。

2
Dario Castro

My.iniファイルとphp.iniファイルでmysqlのポートを3306から3307に変更したとき、私にはそれが起こりました。

2
MrPencil

ただこれを経験しました。

それを動作させるために手に入れました:(これは静的ブロック初期化に置くことができます)

static{ // would have to be surrounded by try catch
    Class.forName("com.mysql.jdbc.Driver");   // this will load the class Driver
}

また、次の方法で接続を取得します。

conn = DriverManager.getConnection(DBURL,<username>,<password>);

ログインパラメータを指定する代わりに

  Connection conn = DriverManager.getConnection( "jdbc:mysql://localhost:3306/projects?user=user1&password=123");

よろしく。

2
mel3kings

localhost127.0.0.1に変更してみてください。

ローカルホストは::1に解決されます。そしてMySQLはデフォルトでIPv6経由で接続できません。

そして、これがtelnet localhost 3306の出力です。

$ telnet localhost 3306
Trying ::1...

そしてMySQLサーバーからの応答がありません。

もちろん、MySQLサーバーが稼働していることを確認してください。

1
Haozhe Xie

Remote Mysqlへの呼び出し

  1. IP = remoteIPの例として、 Mysql リモートユーザーを追加します。

    mysql -u xxxx -p //local coonection to mysql
    mysql> GRANT ALL PRIVILEGES ON *.* TO 'theNewUser'@'remoteIP' IDENTIFIED BY 'passWord';
    //Query OK, 0 rows affected (xx sec)
    mysql> FLUSH PRIVILEGES;
    //Query OK, 0 rows affected
    
  2. Mysqlへのリモートアクセスを許可します(デフォルトではすべての外部呼び出しは許可されていません)。

    Edit 
    /etc/mysql/mysql.conf.d/mysqld.cnf    or    /etc/mysql/my.cnf
    Change line:  bind-address = 127.0.0.1   to
                  #bind-address = 127.0.0.1
    Restart Mysql: /etc/init.d/mysql restart
    
  3. JDBCドライバの最新バージョン、JDBCの場合:

    jdbc.url='jdbc:mysql://remoteIP:3306/yourDbInstance?autoReconnect=true&amp;useUnicode=true&amp;useJDBCCompliantTimezoneShift=true&amp;useLegacyDatetimeCode=false&amp;serverTimezone=UTC'
    jdbc.user='theNewUser'
    
1
Yugerten

私のMacBookでは、Eclipse EEの新しいバージョンを再インストールし、xampp mysql for mampのようなローカルサーバーを削除したが、そのうちの1つだけを使用した場合にのみ、このエラーを解決した。

0
m Piroli

MySQLの古いバージョン( 'version'、 '5.1.73')に接続しようとしていました。新しいドライババージョンを使用すると、 "com.mysql.cj.jdbc.Driverを使用するように指示するエラーが表示されます。あなたが使うもの:

クラスcom.mysql.jdbc.Driver'. This is deprecated. The new driver class iscom.mysql.cj.jdbc.Driver 'を読み込みます。ドライバはSPIを介して自動的に登録され、ドライバクラスの手動ロードは通常不要です。

宣言を変更して、5.1.38バージョンのmysql-connector-Javaを使用し、コード内でcom.mysql.jdbc.Driverを保持しました。

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-Java</artifactId>
    <version>5.1.38</version>
</dependency>

Ankit Jainの 答え を見たときにすべてが始まりました

0
hestellez

私の場合は、リモートデータベースへのSSHトンネルを確立する必要があり、すべての設定は正しく、PhpStormとの接続のテストも成功しました。また、スキーマはロードされましたが、データはロードされませんでした。代わりに私は得た:

[08S01] 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.

上記の提案はどれもうまくいきませんでした。いずれにせよ私は単にPhpStormを再起動することによって問題を解決しようとしました、そして、それがうまくいった!

0
Tech Nomad

私のMySQLが聞いていたポスト3307を私のファイアウォールがブロックしていました。そのため、ポートを3307から3306に変更しました。その後、データベースに正常に接続できます。

0
Michal Šípek

次のような複数のエラーが表示されました。

  • CommunicationsException: Communications link failure
  • Java.lang.NullPointerException: Attempt to invoke interface method 'Java.sql.Statement Java.sql.Connection.createStatement()' on a null object reference at

私は追加しなければなりませんでした:

  • AndroidManifest.xmlでは、開始マニフェストタグの直後に<uses-permission Android:name="Android.permission.INTERNET"/>を含めます。

  • Gradle(またはMaven)の依存関係にJDBCドライバを追加してください。

0
Daniel Segura

/etc/mysql/my.cnfファイルを開きます。

bind-address = 127.0.0.1 to bind-address = 192.168.0.3 #this is your local system IP Address

特定のIPアドレスのmysqlで以下のコマンドを実行します - >

grant all privileges on dbname.* to dbusername@'192.168.0.3' IDENTIFIED BY 'dbpassword';                      

すべてのIPアドレスへのアクセスを許可したい場合は、以下のコマンドを実行してください。

grant all privileges on dbname.* to dbusername@'%' IDENTIFIED BY 'dbpassword'; 
0
ShivBuyya

私は私のアプリケーションを起動している間に私は同じ問題に直面していました、

Caused by: 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.

問題は、mysqlファイル /etc/mysql/mysql.conf.d/mysqld.cnf では、設定が次のようになっていたことです。

[mysqld]
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
datadir         = /var/lib/mysql
log-error       = /var/log/mysql/error.log
# By default we only accept connections from localhost
bind-address    = 127.0.0.1
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

バインドアドレスが127.0.0.1を指していることがわかりますので、アプリケーションを起動するための簡単な解決策は、 jdbc:mysql://127.0.0.1:3306/pizzeria を使用することです。 jdbc:mysql:// localhost:3306/pizzeria mysqlをアプリケーションまたは他のソリューションに接続するのは、mysqlの設定を確認してdefaultに変更できることです。どちらのソリューションでも動作します。私はそれがあなた達にとってもうまくいくことを願っています。

0
Prakhar Agrawal

それは単純なjar問題かもしれません。現在のMySQLバージョンではサポートされていない古いmysql-connector-Java-XXX-bin.jarを使用している可能性があります。私はmysql-connector-Java-5.1.18-bin.jarを使用しているのでmysql 5.5を使用しましたが、この問題は解決しました。

0
Ankit Jain

MysqlとApache Serverを起動していないのかもしれません。 XAMPPコントロールパネルからApacheサーバーとMysqlを起動した後、接続は正常に確立されました。

がんばろう!

0
shivam gupta

私は同じ接続エラーがあります:私が持っている問題は私がMySQL 8.0.15を使用したことですが、Javaコネクタは5.x.xです。

下記はhowenter code hereです。 1. 8.0.15をダウンロードしてください。 Mavenリポジトリから: https://search.maven.org/search?q=g:mysql%20AND%20a:mysql-connector-Java

  1. Eclipse IDEでは、エクスプローラで「参照ライブラリ」を選択します。マウスの右ボタン>ビルドパス>ビルドパスの設定"mysql-connector-5.x.jar"を削除します。 「外部JARを追加...」をクリックして、mysql-connector-Java-8.0.15.jarを選択します。

もう一度実行すると、問題は解決しました。

0
Peter Chen

私のために解決したのは2つのことをやっている:1。次のconnadを使用していくつかのパスワードでroot以外の新しいユーザーを作成します。

CREATE USER 'newuser'@'localhost' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON *.* TO 'newuser'@'localhost';
FLUSH PRIVILEGES;

2. mysqld.confのIPアドレス行をコメントアウトします。

それから新しいユーザー名とパスワードで接続してください。それはうまくいくはずです。

0
Abdul Khalid

私は同じ問題を抱えていた、そしてこれがどのように修正されたかです:

  1. 私の.jspは、まだサーブレットで定義していない属性を呼び出していました。
  2. データベース内の列名と一致しない、ResultSet (getString("columnName"))を介してオブジェクトに渡す列名が2つありました。

どれが問題を解決したのか正確には分かりませんが、うまくいきました。また、テーブルクエリごとに必ず新しいStatementResultSetを作成してください。

0
user3427633