JDBC と MySQL を使用して「通信リンク障害」の問題を解決する
P粉633309801
2023-08-28 10:53:42
<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>
私も 2 つのプログラムで同じ問題に遭遇しました。私のエラーは次のとおりです:
リーリーこの問題を解決するのに数日かかりました。さまざまなウェブサイトで言及されている多くの方法をテストしましたが、どれも機能しませんでした。最後にコードを変更して問題を解決しました。さまざまな方法を紹介し、ここでまとめます。
このエラーの解決策をインターネットで検索したところ、 少なくとも 1 人には効果のある解決策が多数あることがわかりましたが、他の人には効果がなかったという人もいます。
strong> このエラーを修正する方法がたくさんあるのはなぜですか? 通常、このエラーはサーバーへの接続に問題がある場合に発生するようです。問題の原因は、クエリ文字列が間違っているか、データベースへの接続が多すぎることが考えられます。 ですから、すべての解決策を 1 つずつ試して、諦めないことをお勧めします。/etc/mysql/my.cnf
または
/etc/my.cnf(使用する Linux ディストリビューションと MySQL パッケージに応じて)
p>C:\**ProgramData**\MySQL\MySQL Server 5.6\my.ini
(Program Files ではなく ProgramData であることに注意してください)
バインドアドレス
プロパティ:
bind-address
プロパティのコメントを解除するか、次のいずれかの IP に変更します:
リーリー ###または### リーリーMySQL 構成ファイルに skip-networking
行がある場合は、行の先頭に# シンボルを追加してコメントアウトしてください。
次の行を MySQL 構成ファイルに追加します: リーリー
MySQL は 127.0.0.1
(IPv4
接続文字列で) は認識できますが、
:::1(
IPv6)
これは、次の 2 つの方法のいずれかを使用することで回避できます。
localhost- の代わりに
-Djava.net.preferIPv4Stack=true- を使用して Java を実行し、Java が
127.0.0.1
オプションを使用して、
localhostが
:::1 に変換されるのを回避しますIPv6
ではなく
IPv4を使用するように強制します。 Linux では、これを実行する (またはこれを
/etc/profile:
に置く) ことによっても実現できます。 リーリーMySQL サービスがファイアウォールやウイルス対策ソフトウェアによってブロックされていないことを確認してください。
Linux 上で iptables を一時的に停止します。 iptables の設定が間違っている場合、tcp パケットが mysql ポートに送信されることは許可されますが、tcp パケットが同じ接続に戻ることができなくなります。リーリー
Windows 上のウイルス対策ソフトウェアを停止します。クエリ文字列を確認してください。接続文字列は次のようになります: リーリー
リーリー
通常、MySQL のデフォルトのポートは 3306 です。
ユーザー名とパスワードを MySQL サーバーのものに変更することを忘れないでください。
"max_allowed_packet" は、パケットの最大数ではなく、最大パケット サイズを示す MySQL 構成ファイル内の変数です。したがって、これはこのエラーの解決には役立ちません。
リーリー
これらの解決策はどれも私にとっては役に立ちませんでしたが、試してみることをお勧めします。なぜなら、次の手順に従って問題を解決した人もいるからです。
しかし、何が私の問題を解決したのでしょうか?
私の問題は、データベースに大量の SELECT があることです。接続を作成して閉じるたびに。毎回接続を閉じていますが、システムは多くの接続に直面しており、このエラーが発生します。私がやったのは、接続変数をクラス全体のパブリック (またはプライベート) 変数として定義し、コンストラクターで初期化することでした。 その後、その接続を使用するたびに。それは私の問題を解決し、速度を大幅に向上させました。 ####結論は# この問題を解決する簡単でユニークな方法はありません。ご自身の状況に基づいて上記の解決策を検討することをお勧めします。プログラムの開始時にこのエラーが発生し、データベースにまったく接続できない場合は、接続文字列に問題がある可能性があります。ただし、データベースとのやり取りが何度も成功した後にこのエラーが発生する場合は、接続数に問題がある可能性があるため、「wait_timeout」およびその他の MySQL 設定を変更するか、コードを書き直して接続数を減らすことを検討してください。