Menyelesaikan isu "kegagalan pautan komunikasi" menggunakan JDBC dan MySQL
P粉633309801
P粉633309801 2023-08-28 10:53:42
0
1
495
<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粉633309801
P粉633309801

membalas semua(1)
P粉731861241

Saya juga mengalami masalah yang sama dalam dua program. Kesilapan saya ialah:

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.

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-addressSifat:

    Nyahkomen atribut bind-address atau tukar kepada salah satu IP berikut:

    bind-address="127.0.0.1"

    atau

    bind-address="0.0.0.0"
  • 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:

    [wait_timeout][1] = *number*
    
    interactive_timeout = *number*
    
    connect_timeout = *number*
  • 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:

    1. Gunakan 127.0.0.1 而不是 localhost 以避免 localhost 被转换为 ::: 1

      dalam rentetan sambungan
    2. Gunakan pilihan -Djava.net.preferIPv4Stack=true运行java以强制java使用IPv4而不是IPv6。在 Linux 上,这也可以通过运行(或将其放入 /etc/profile untuk mencapai:

      export _JAVA_OPTIONS="-Djava.net.preferIPv4Stack=true"
  • 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.

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

    Hentikan perisian antivirus pada Windows.

  • Tukar rentetan sambungan

    Semak rentetan pertanyaan anda. Rentetan sambungan anda sepatutnya kelihatan seperti ini:

    dbName = "my_database";
    dbUserName = "root";
    dbPassword = "";
    String connectionString = "jdbc:mysql://localhost/" + dbName + "?user=" + dbUserName + "&password=" + dbPassword + "&useUnicode=true&characterEncoding=UTF-8";

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:

String connectionString = "jdbc:mysql://localhost:3306/my_database?user=root&password=Pass&useUnicode=true&characterEncoding=UTF-8";

Biasanya port lalai untuk MySQL ialah 3306.

Jangan lupa untuk menukar nama pengguna dan kata laluan kepada pelayan MySQL anda.

  • Kemas kini fail perpustakaan pemacu JDK anda
  • Uji JDK dan JRE yang berbeza (cth. JDK 6 dan 7)
  • Jangan tukar max_allowed_packet

"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 keselamatan tomcat

Tukar TOMCAT6_SECURITY=ya kepada TOMCAT6_SECURITY=tidak

  • Gunakan atribut validationQuery

Gunakan validationQuery="select now()" untuk memastikan jawapan bagi setiap pertanyaan

  • Sambung semula automatik

Tambahkan kod ini pada rentetan sambungan anda:

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

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.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan