Menyelesaikan isu "kegagalan pautan komunikasi" menggunakan JDBC dan 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>
Saya juga mengalami masalah yang sama dalam dua program. Kesilapan saya ialah:
Saya mengambil masa beberapa hari untuk menyelesaikan masalah ini. Saya telah menguji banyak kaedah yang disebutkan di laman web yang berbeza tetapi tiada satu pun daripada mereka yang berkesan. Akhirnya saya menukar kod dan mengetahui masalahnya. Saya akan cuba memperkenalkan anda kepada kaedah yang berbeza dan ringkaskannya di sini.
Semasa saya mencari penyelesaian kepada ralat ini di internet, saya mendapati Terdapat banyak penyelesaian yang berkesan untuk sekurang-kurangnya seorang, tetapi yang lain berkata ia tidak berkesan untuk mereka!
kuat> Mengapa terdapat banyak cara untuk membetulkan ralat ini? Nampaknya kebiasaannya ralat ini berlaku apabila terdapat masalah menyambung ke pelayan. Mungkin masalahnya adalah kerana rentetan pertanyaan yang salah atau terlalu banyak sambungan ke pangkalan data.Jadi saya cadangkan anda mencuba semua penyelesaian satu demi satu dan jangan berputus asa!
Di bawah adalah penyelesaian yang saya temui di internet, untuk setiap penyelesaian sekurang-kurangnya masalah seorang telah diselesaikan oleh penyelesaian itu.
Petua: Untuk penyelesaian yang memerlukan penukaran tetapan MySQL, sila rujuk dokumen berikut:
Linux:
/etc/mysql/my.cnf
或/etc/my.cnf
(bergantung pada pengedaran Linux dan pakej MySQL yang digunakan) p>Windows:
C:**ProgramData**MySQLMySQL Server 5.6my.ini
(perhatikan itu ProgramData, bukan Program Files)Ini penyelesaiannya:
Ubah
bind-address
Sifat:Nyahkomen atribut
bind-address
atau tukar kepada salah satu IP berikut:atau
Ulas “langkau rangkaian”
Jika terdapat simbol
skip-networking
行,请在该行的开头添加#
dalam fail konfigurasi MySQL, komennya.Tukar "masa_tunggu" dan "masa_interaktif"
Tambah baris ini pada fail konfigurasi MySQL:
Pastikan Java tidak menterjemah "localhost" sebagai [:::1] dan bukannya [127.0.0.1]
Sebab MySQL boleh mengenali
127.0.0.1
(IPv4
),但不能识别:::1
(IPv6
)Ini boleh dielakkan dengan menggunakan salah satu daripada dua kaedah:
Gunakan
dalam rentetan sambungan127.0.0.1
而不是localhost
以避免localhost
被转换为::: 1
Gunakan pilihan
-Djava.net.preferIPv4Stack=true
运行java以强制java使用IPv4
而不是IPv6
。在 Linux 上,这也可以通过运行(或将其放入/etc/profile
untuk mencapai:Semak tetapan proksi sistem pengendalian, firewall dan program antivirus
Pastikan perkhidmatan MySQL tidak disekat oleh firewall atau perisian anti-virus.
Hentikan sementara iptables pada Linux. Jika iptables tersalah konfigurasi, ia mungkin membenarkan paket tcp dihantar ke port mysql, tetapi menghalang paket tcp daripada kembali ke sambungan yang sama.
Hentikan perisian antivirus pada Windows.
Tukar rentetan sambungan
Semak rentetan pertanyaan anda. Rentetan sambungan anda sepatutnya kelihatan seperti ini:
Pastikan tiada ruang dalam rentetan. Semua rentetan sambungan hendaklah bersebelahan tanpa sebarang aksara ruang.
Cuba gantikan "localhost" dengan alamat gelung balik 127.0.0.1. Cuba tambahkan nombor port pada rentetan sambungan, seperti:
Biasanya port lalai untuk MySQL ialah 3306.
Jangan lupa untuk menukar nama pengguna dan kata laluan kepada pelayan MySQL anda.
"max_allowed_packet" ialah pembolehubah dalam fail konfigurasi MySQL yang menunjukkan saiz paket maksimum, bukan bilangan maksimum paket. Jadi ini tidak membantu dalam menyelesaikan ralat ini.
Tukar TOMCAT6_SECURITY=ya kepada TOMCAT6_SECURITY=tidak
Gunakan validationQuery="select now()" untuk memastikan jawapan bagi setiap pertanyaan
Tambahkan kod ini pada rentetan sambungan anda:
Walaupun tiada penyelesaian ini berkesan untuk saya, saya syorkan anda mencubanya. Kerana sesetengah orang menyelesaikan masalah mereka dengan mengikuti langkah-langkah ini.
Tetapi apakah yang menyelesaikan masalah saya?
Masalah saya ialah saya mempunyai banyak PILIHAN dalam pangkalan data. Setiap kali saya membuat sambungan dan kemudian menutupnya. Walaupun saya menutup sambungan setiap kali, sistem menghadapi banyak sambungan dan memberi saya ralat ini. Apa yang saya lakukan ialah mentakrifkan pembolehubah sambungan sebagai pembolehubah awam (atau peribadi) untuk keseluruhan kelas dan memulakannya dalam pembina. Kemudian setiap kali saya menggunakan sambungan itu. Ia menyelesaikan masalah saya dan meningkatkan kelajuan saya dengan sangat hebat.
#kesimpulan# Tidak ada cara yang mudah dan unik untuk menyelesaikan masalah ini. Adalah disyorkan agar anda mempertimbangkan penyelesaian di atas berdasarkan situasi anda sendiri. Jika anda mendapat ralat ini pada permulaan program anda dan tidak dapat menyambung ke pangkalan data sama sekali, mungkin terdapat sesuatu yang tidak kena dengan rentetan sambungan anda. Walau bagaimanapun, jika anda mendapat ralat ini selepas banyak interaksi yang berjaya dengan pangkalan data, masalahnya mungkin dengan bilangan sambungan dan anda boleh mempertimbangkan untuk menukar "wait_timeout" dan tetapan MySQL yang lain, atau menulis semula kod untuk mengurangkan bilangan sambungan.