sql >> データベース >  >> RDS >> Mysql

JDBCとMySQLを使用した通信リンク障害の解決

    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つずつ試して、あきらめないことをお勧めします。

    これが私がインターネットで見つけた解決策であり、それぞれについて、少なくとも彼の問題がその解決策で解決された人がいます。

    ヒント:MySQL設定を変更する必要があるソリューションについては、次のファイルを参照できます。

    • Linux:/etc/mysql/my.cnf または/etc/my.cnf (使用するLinuxディストリビューションとMySQLパッケージによって異なります)

    • Windows:C:\**ProgramData**\MySQL\MySQL Server 5.6\my.ini (プログラムファイルではなく、ProgramDataであることに注意してください)

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

    • bind-addressを変更する 属性:

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

       bind-address="127.0.0.1"
      

      または

       bind-address="0.0.0.0"
      
    • 「スキップネットワーキング」のコメント

      skip-networkingがある場合 MySQL構成ファイルの行に、#を追加してコメントを付けます その行の先頭に署名します。

    • 「wait_timeout」と「interactive_timeout」を変更します

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

      [wait_timeout][1] = *number*
      
      interactive_timeout = *number*
      
      connect_timeout = *number*
      
    • Javaが「localhost」を[127.0.0.1]ではなく[:::1]に変換していないことを確認してください

      MySQLは127.0.0.1を認識するため (IPv4 )ただし、:::1ではありません (IPv6

      これは、次の2つのアプローチのいずれかを使用することで回避できます。

      1. 接続文字列では、127.0.0.1を使用します localhostの代わりに localhostを避けるため :::1に翻訳されています

      2. オプション-Djava.net.preferIPv4Stack=trueを指定してjavaを実行します JavaにIPv4を使用させる IPv6の代わりに 。 Linuxでは、これは実行する(または/etc/profile内に配置する)ことでも実現できます。 :

         export _JAVA_OPTIONS="-Djava.net.preferIPv4Stack=true"
        
    • オペレーティングシステムのプロキシ設定、ファイアウォール、ウイルス対策プログラムを確認してください

      ファイアウォールまたはウイルス対策ソフトウェアがMySQLサービスをブロックしていないことを確認してください。

      Linuxでiptablesを一時的に停止します。 iptablesが正しく構成されていない場合、tcpパケットをmysqlポートに送信することはできますが、tcpパケットが同じ接続に戻るのをブロックする可能性があります。

       # Redhat enterprise and CentOS
       systemctl stop iptables.service
       # Other linux distros
       service iptables stop
      

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

    • 接続文字列を変更

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

      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など)をテストします
    • ma​​x_allowed_pa​​cketを変更しないでください

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

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

    TOMCAT6_SECURITY=yesをTOMCAT6_SECURITY=no

    に変更します
    • validationQueryプロパティを使用する

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

    • 自動再接続

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

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

    これらの解決策はどれも私には効果がありませんでしたが、試してみることをお勧めします。これらの手順に従うことで問題を解決した人がいるからです。

    しかし、何が私の問題を解決しましたか?

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

    #結論#この問題を解決するための簡単でユニークな方法はありません。自分の状況を考えて、上記の解決策を選択することをお勧めします。プログラムの開始時にこのエラーが発生し、データベースにまったく接続できない場合は、接続文字列に問題がある可能性があります。ただし、データベースとのやり取りが何度か成功した後にこのエラーが発生した場合は、接続数に問題がある可能性があり、「wait_timeout」やその他のMySQL設定を変更するか、コードを書き直して接続数を減らすことを検討してください。



    1. Oracle Security Alert for CVE-2021-44228

    2. フラスコで自動インクリメントの主キーを作成できません-sqlalchemy

    3. EntityFrameworkでSQLServerシーケンスの次の値を取得するにはどうすればよいですか?

    4. Oracleでは、ビューを介してレコードを挿入または更新することはできますか?