Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Memecahkan kegagalan tautan komunikasi dengan JDBC dan MySQL

Saya memiliki masalah yang sama di dua program saya. Kesalahan saya adalah ini:

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 menghabiskan beberapa hari untuk menyelesaikan masalah ini. Saya telah menguji banyak pendekatan yang telah disebutkan di berbagai situs web, tetapi tidak ada yang berhasil. Akhirnya saya mengubah kode saya dan menemukan apa masalahnya. Saya akan mencoba memberi tahu Anda tentang berbagai pendekatan dan meringkasnya di sini .

Saat saya mencari di internet untuk menemukan solusi untuk kesalahan ini, saya menemukan bahwa ada banyak solusi yang bekerja untuk setidaknya satu orang, tetapi yang lain mengatakan bahwa itu tidak berhasil untuk mereka! mengapa ada banyak pendekatan untuk kesalahan ini? Tampaknya kesalahan ini dapat terjadi umumnya ketika ada masalah dalam menghubungkan ke server . Mungkin masalahnya karena string kueri yang salah atau terlalu banyak koneksi ke database.

Jadi saya sarankan Anda untuk mencoba semua solusi satu per satu dan jangan menyerah!

Berikut adalah solusi yang saya temukan di internet dan untuk masing-masing dari mereka, setidaknya ada orang yang masalahnya telah diselesaikan dengan solusi itu.

Tip:Untuk solusi yang Anda butuhkan untuk mengubah pengaturan MySQL, Anda dapat merujuk ke file berikut:

  • Linux:/etc/mysql/my.cnf atau /etc/my.cnf (tergantung pada distribusi Linux dan paket MySQL yang digunakan)

  • Windows:C:\**ProgramData**\MySQL\MySQL Server 5.6\my.ini (Perhatikan itu ProgramData, bukan Program Files)

Berikut solusinya:

  • mengubah bind-address atribut:

    Batalkan komentar bind-address atau ubah ke salah satu IP berikut:

     bind-address="127.0.0.1"
    

    atau

     bind-address="0.0.0.0"
    
  • mengomentari "lewati-jaringan"

    Jika ada skip-networking baris di file konfigurasi MySQL Anda, beri komentar dengan menambahkan # tanda tangani di awal baris itu.

  • ubah "wait_timeout" dan "interactive_timeout"

    Tambahkan baris berikut ke file konfigurasi MySQL:

    [wait_timeout][1] = *number*
    
    interactive_timeout = *number*
    
    connect_timeout = *number*
    
  • Pastikan Java tidak menerjemahkan 'localhost' ke [:::1] alih-alih [127.0.0.1]

    Karena MySQL mengenali 127.0.0.1 (IPv4 ) tapi bukan :::1 (IPv6 )

    Ini dapat dihindari dengan menggunakan salah satu dari dua pendekatan:

    1. Dalam string koneksi gunakan 127.0.0.1 bukannya localhost untuk menghindari localhost sedang diterjemahkan ke :::1

    2. Jalankan java dengan opsi -Djava.net.preferIPv4Stack=true untuk memaksa Java menggunakan IPv4 bukannya IPv6 . Di Linux, ini juga dapat dicapai dengan menjalankan (atau menempatkannya di dalam /etc/profile :

       export _JAVA_OPTIONS="-Djava.net.preferIPv4Stack=true"
      
  • periksa setelan proxy Sistem Operasi, firewall, dan program anti-virus

    Pastikan Firewall, atau perangkat lunak Anti-virus tidak memblokir layanan MySQL.

    Hentikan iptables sementara di linux. Jika iptables salah dikonfigurasi, mereka memungkinkan paket tcp dikirim ke port mysql, tetapi memblokir paket tcp agar tidak kembali pada koneksi yang sama.

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

    Hentikan perangkat lunak anti-virus di Windows.

  • mengubah string koneksi

    Periksa string kueri Anda. string koneksi Anda harus seperti ini:

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

Pastikan Anda tidak memiliki spasi di string Anda. Semua string koneksi harus dilanjutkan tanpa karakter spasi.

Coba ganti "localhost" dengan alamat loopback 127.0.0.1. Coba juga tambahkan nomor port ke string koneksi Anda, seperti:

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

Biasanya port default untuk MySQL adalah 3306.

Jangan lupa untuk mengganti username dan password menjadi username dan password server MySQL Anda.

  • perbarui file perpustakaan driver JDK Anda
  • menguji JDK dan JRE yang berbeda (seperti JDK 6 dan 7)
  • jangan ubah max_allowed_packet

"max_allowed_packet " adalah variabel dalam file konfigurasi MySQL yang menunjukkan ukuran paket maksimum, bukan jumlah maksimum paket. Jadi tidak akan membantu mengatasi kesalahan ini.

  • mengubah keamanan kucing jantan

ubah TOMCAT6_SECURITY=ya menjadi TOMCAT6_SECURITY=tidak

  • gunakan properti validationQuery

gunakan validasiQuery="select now()" untuk memastikan setiap kueri memiliki tanggapan

  • Hubungkan Ulang Otomatis

Tambahkan kode ini ke string koneksi Anda:

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

Meskipun tidak ada solusi yang berhasil untuk saya, saya sarankan Anda untuk mencobanya. Karena ada beberapa orang yang memecahkan masalah mereka dengan mengikuti langkah-langkah ini.

Tetapi apa yang memecahkan masalah saya?

Masalah saya adalah saya memiliki banyak SELECT di database. Setiap kali saya membuat koneksi dan kemudian menutupnya. Meskipun saya selalu menutup koneksi, tetapi sistem menghadapi banyak koneksi dan memberi saya kesalahan itu. Yang saya lakukan adalah mendefinisikan variabel koneksi saya sebagai variabel publik (atau pribadi) untuk seluruh kelas dan menginisialisasinya dalam konstruktor. Kemudian setiap kali saya hanya menggunakan koneksi itu. Ini memecahkan masalah saya dan juga meningkatkan kecepatan saya secara dramatis.

#Kesimpulan#Tidak ada cara sederhana dan unik untuk menyelesaikan masalah ini. Saya menyarankan Anda untuk memikirkan situasi Anda sendiri dan memilih solusi di atas. Jika Anda mengambil kesalahan ini di awal program dan Anda tidak dapat terhubung ke database sama sekali, Anda mungkin memiliki masalah dalam string koneksi Anda. Tetapi jika Anda mengambil kesalahan ini setelah beberapa interaksi berhasil ke database, masalahnya mungkin dengan jumlah koneksi dan Anda mungkin berpikir untuk mengubah "wait_timeout" dan pengaturan MySQL lainnya atau menulis ulang kode Anda bagaimana mengurangi jumlah koneksi.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara menyimpan unicode di MySQL?

  2. Bagaimana saya bisa mensimulasikan variabel array di MySQL?

  3. Jumlahkan nilai array multidimensi dengan kunci tanpa loop

  4. MySQL NULLIF() Dijelaskan

  5. Berikan Izin ke Pengguna MySQL di Linux melalui Command Line