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:
-
Dalam string koneksi gunakan
127.0.0.1
bukannyalocalhost
untuk menghindarilocalhost
sedang diterjemahkan ke:::1
-
Jalankan java dengan opsi
-Djava.net.preferIPv4Stack=true
untuk memaksa Java menggunakanIPv4
bukannyaIPv6
. 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.