ホームページ  >  に質問  >  本文

JDBC と MySQL を使用して「通信リンク障害」の問題を解決する

<p>我正在尝试连接到本地 MySQL 服务器,但不断收到错误消息。</p> <p>这是代码。</p> <pre class="brush:php;toolbar:false;">public class Connect { public static void main(String[] args) { Connection conn = null; try { String userName = "myUsername"; String password = "myPassword"; String url = "jdbc:mysql://localhost:3306/myDatabaseName"; Class.forName("com.mysql.jdbc.Driver").newInstance(); conn = DriverManager.getConnection(url, userName, password); System.out.println("Database connection established"); } catch (Exception e) { System.err.println("Cannot connect to database server"); System.err.println(e.getMessage()); e.printStackTrace(); } finally { if (conn != null) { try { conn.close(); System.out.println("Database Connection Terminated"); } catch (Exception e) {} } } } }</pre> <p>以及错误:</p> <pre class="brush:php;toolbar:false;">Cannot connect to database server 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. 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:411) at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1116) at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:344) at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2333) at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2370) at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2154) at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:792) at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:47) 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:411) at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:381) at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:305) at java.sql.DriverManager.getConnection(DriverManager.java:582) at java.sql.DriverManager.getConnection(DriverManager.java:185) at Connect.main(Connect.java:16) Caused by: java.net.ConnectException: Connection refused at java.net.PlainSocketImpl.socketConnect(Native Method) at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:351) at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:213) at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:200) at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366) 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:257) at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:294) ... 15 more</pre> <p>我已经设置了类路径,确保 my.cnf 已注释掉跳过网络选项。 </p> <p>java版本是1.2.0_26(64位) mysql 5.5.14 mysql连接器5.1.17</p> <p>我确保用户有权访问我的数据库。</p>
P粉633309801P粉633309801419日前441

全員に返信(1)返信します

  • P粉731861241

    P粉7318612412023-08-29 00:12:12

    私も 2 つのプログラムで同じ問題に遭遇しました。私のエラーは次のとおりです:

    リーリー

    この問題を解決するのに数日かかりました。さまざまなウェブサイトで言及されている多くの方法をテストしましたが、どれも機能しませんでした。最後にコードを変更して問題を解決しました。さまざまな方法を紹介し、ここでまとめます

    このエラーの解決策をインターネットで検索したところ、 少なくとも 1 人には効果のある解決策が多数あることがわかりましたが、他の人には効果がなかったという人もいます。

    strong> このエラーを修正する方法がたくさんあるのはなぜですか? 通常、このエラーはサーバーへの接続に問題がある場合に発生するようです。問題の原因は、クエリ文字列が間違っているか、データベースへの接続が多すぎることが考えられます。

    ですから、すべての解決策を 1 つずつ試して、諦めないことをお勧めします。

    以下は私がインターネットで見つけた解決策です。各解決策について、少なくとも 1 人の問題がその解決策によって解決されました。

    ヒント: MySQL 設定の変更が必要なソリューションについては、次のファイルを参照してください:

    • Linux:

      /etc/mysql/my.cnf または /etc/my.cnf (使用する Linux ディストリビューションと MySQL パッケージに応じて)

    • Windows:

      C:\**ProgramData**\MySQL\MySQL Server 5.6\my.ini (Program Files ではなく ProgramData であることに注意してください)

    解決策は次のとおりです:

    • 変更

      バインドアドレスプロパティ:

      bind-address プロパティのコメントを解除するか、次のいずれかの IP に変更します: リーリー ###または### リーリー

    • 「skip-networking」をコメントアウトします
    • MySQL 構成ファイルに skip-networking

      行がある場合は、行の先頭に

      # シンボルを追加してコメントアウトしてください。

    • 「wait_timeout」と「interactive_timeout」を変更します
    • 次の行を MySQL 構成ファイルに追加します: リーリー

    • Java が「localhost」を [127.0.0.1] ではなく [:::1] に変換しないようにします
    • MySQL は 127.0.0.1

      (

      IPv4) は認識できますが、:::1 (IPv6) これは、次の 2 つの方法のいずれかを使用することで回避できます。 < /p>

      接続文字列で
        localhost
      1. の代わりに

        127.0.0.1 を使用して、localhost:::1 に変換されるのを回避します

        オプション
      2. -Djava.net.preferIPv4Stack=true
      3. を使用して Java を実行し、Java が

        IPv6 ではなく IPv4 を使用するように強制します。 Linux では、これを実行する (またはこれを /etc/profile: に置く) ことによっても実現できます。 リーリー

    • オペレーティング システムのプロキシ設定、ファイアウォール、ウイルス対策プログラムを確認してください
    • MySQL サービスがファイアウォールやウイルス対策ソフトウェアによってブロックされていないことを確認してください。

      Linux 上で iptables を一時的に停止します。 iptables の設定が間違っている場合、tcp パケットが mysql ポートに送信されることは許可されますが、tcp パケットが同じ接続に戻ることができなくなります。

      リーリー

      Windows 上のウイルス対策ソフトウェアを停止します。

    • 接続文字列の変更
    • クエリ文字列を確認してください。接続文字列は次のようになります: リーリー

      文字列にスペースが含まれていないことを確認してください。すべての接続文字列は、スペース文字を含めずに連続している必要があります。
    「localhost」をループバック アドレス 127.0.0.1 に置き換えてみてください。 また、接続文字列にポート番号を追加してみてください。例:

    リーリー

    通常、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()" を使用して、各クエリに応答があることを確認します

    • 自動再接続
    次のコードを接続文字列に追加します:

    リーリー


    これらの解決策はどれも私にとっては役に立ちませんでしたが、試してみることをお勧めします。なぜなら、次の手順に従って問題を解決した人もいるからです。

    しかし、何が私の問題を解決したのでしょうか?

    私の問題は、データベースに大量の SELECT があることです。接続を作成して閉じるたびに。毎回接続を閉じていますが、システムは多くの接続に直面しており、このエラーが発生します。

    私がやったのは、接続変数をクラス全体のパブリック (またはプライベート) 変数として定義し、コンストラクターで初期化することでした。 その後、その接続を使用するたびに。それは私の問題を解決し、速度を大幅に向上させました。 ####結論は# この問題を解決する簡単でユニークな方法はありません。ご自身の状況に基づいて上記の解決策を検討することをお勧めします。プログラムの開始時にこのエラーが発生し、データベースにまったく接続できない場合は、接続文字列に問題がある可能性があります。ただし、データベースとのやり取りが何度も成功した後にこのエラーが発生する場合は、接続数に問題がある可能性があるため、「wait_timeout」およびその他の MySQL 設定を変更するか、コードを書き直して接続数を減らすことを検討してください。

    返事
    0
  • キャンセル返事