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 satupun yang berhasil. Akhirnya saya mengubah kode saya dan menemukan apa masalahnya. Saya akan mencoba memberi tahu Anda tentang berbagai pendekatan dan menjumlahkannya di sini .
Ketika 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 itu tidak bekerja untuk mereka! mengapa ada banyak pendekatan untuk kesalahan ini?
Tampaknya kesalahan ini dapat terjadi secara umum ketika ada masalah dalam menghubungkan ke server . Mungkin masalahnya adalah 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 pada orang yang masalahnya telah diselesaikan dengan solusi itu.
poin: Untuk solusi yang Anda perlukan untuk mengubah pengaturan MySQL, Anda dapat merujuk pada yang berikut tidak:
Inilah solusinya:
- mengubah atribut "bind-address"
Batalkan komentar "bind-address" atribut atau ubah ke salah satu Ips berikut:
bind-address = "127.0.0.1"
atau
bind-address = "0.0.0.0"
- berkomentar "lewati jaringan"
Jika ada baris "lewati jaringan" di file konfigurasi MySQL Anda, buat komentar dengan menambahkan tanda "#" di awal baris itu.
- ubah "wait_timeout" dan "interactive_timeout"
Tambahkan baris ini ke file konfigurasi MySQL:
wait_timeout = angka
interactive_timeout = angka
connect_timeout = angka
- periksa pengaturan proxy Sistem Pengoperasian
Pastikan Fire wall, atau perangkat lunak anti virus tidak memblokir layanan MySQL.
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.
Cobalah untuk mengganti "localhost" dengan port Anda, seperti 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 mengubah nama pengguna dan kata sandi menjadi nama pengguna dan kata sandi server MySQL Anda.
- perbarui file perpustakaan driver JDK Anda
- uji 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 paket maksimum. Jadi tidak akan membantu untuk menyelesaikan kesalahan ini.
- mengubah keamanan kucing jantan
ubah TOMCAT6_SECURITY = ya menjadi TOMCAT6_SECURITY = tidak
- gunakan properti validationQuery
gunakan validationQuery = "pilih sekarang ()" untuk memastikan setiap permintaan memiliki respons
Tambahkan kode ini ke string koneksi Anda:
&autoReconnect=true&failOverReadOnly=false&maxReconnects=10
Meskipun tidak ada solusi yang bekerja untuk saya, saya sarankan Anda untuk mencobanya. Karena ada beberapa orang bagaimana menyelesaikan masalah mereka dengan mengikuti langkah-langkah ini.
Tetapi apa yang memecahkan masalah saya? Masalah saya adalah bahwa saya memiliki banyak SELECT pada database. Setiap kali saya membuat koneksi dan kemudian menutupnya. Meskipun saya menutup koneksi setiap saat, tetapi sistem dihadapkan dengan banyak koneksi dan memberi saya kesalahan itu. Apa yang saya lakukan adalah saya mendefinisikan variabel koneksi saya sebagai variabel publik (atau pribadi) untuk seluruh kelas dan menginisialisasi dalam konstruktor. Lalu 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 sarankan 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 yang berhasil ke database, masalahnya mungkin dengan jumlah koneksi dan Anda mungkin berpikir tentang mengubah "wait_timeout" dan pengaturan MySQL lainnya atau menulis ulang kode Anda bagaimana mengurangi jumlah koneksi.