Saya telah menginstal instalasi stock mysql 5.5, dan sementara saya dapat terhubung ke layanan mysql melalui perintah mysql, dan layanan ini tampaknya berjalan, saya tidak dapat terhubung ke dalamnya melalui pegas + tomcat atau dari konektor jdbc eksternal.
Saya menggunakan URL berikut:
jdbc:mysql://myserver.com:myport/mydb
dengan nama pengguna / kata sandi yang tepat, tetapi saya menerima pesan berikut:
server.com: 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.
dan tomcat melempar:
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.
sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
Yang tampaknya menjadi masalah yang sama seperti jika saya mencoba untuk terhubung secara eksternal.
Jawaban:
Ini bisa terjadi karena berbagai alasan. Saya baru saja melihatnya sendiri beberapa minggu yang lalu tetapi saya tidak ingat apa yang diperbaiki untuk saya.
1) Pastikan alamat mysql terikat, mungkin 127.0.0.1 (hanya) yang saya yakini adalah default (setidaknya pada server Ubuntu standar). Anda harus mengomentari parameter bind-address di my.cnf untuk mengikat ke semua alamat yang tersedia (Anda tidak dapat memilih beberapa, itu satu atau semua).
2) Jika terikat ke 127.0.0.1 dan Anda tidak dapat terhubung menggunakan "localhost", pastikan itu tidak menyelesaikan ke alamat localhost IPv6, bukan IPv4. (atau cukup gunakan alamat IP)
3) Dobel dan periksa tiga kali port yang sedang didengarkan mysql.
4) Pastikan Anda menggunakan konektor JDBC yang tepat untuk JDK Anda.
5) Pastikan Anda tidak melakukan sesuatu yang sangat konyol seperti memulai mysql dengan --skip-networking.
Saya pikir saran pertama saya paling menjanjikan ... sebenarnya saya pikir di situlah saya melihatnya baru-baru ini ... Saya mencoba untuk terhubung ke mysql dari jarak jauh (juga di Ubuntu 8.04).
sumber
Saya memiliki masalah yang sama di dua program saya. Kesalahan saya adalah ini:
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:
Linux: /etc/my.cnf
Windows: D: \ Program Files \ mysql \ bin \ my.ini
Inilah solusinya:
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"
Jika ada baris "lewati jaringan" di file konfigurasi MySQL Anda, buat komentar dengan menambahkan tanda "#" di awal baris itu.
Tambahkan baris ini ke file konfigurasi MySQL:
wait_timeout = angka
interactive_timeout = angka
connect_timeout = angka
Pastikan Fire wall, atau perangkat lunak anti virus tidak memblokir layanan MySQL.
Periksa string kueri Anda. string koneksi Anda harus seperti ini:
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:
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.
" 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.
ubah TOMCAT6_SECURITY = ya menjadi TOMCAT6_SECURITY = tidak
gunakan validationQuery = "pilih sekarang ()" untuk memastikan setiap permintaan memiliki respons
Tambahkan kode ini ke string koneksi Anda:
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.
sumber
Jika Anda menjalankan instalasi Linux, Anda mungkin memiliki lokkit yang memblokir komunikasi masuk kecuali melalui SSH.
Masuk sebagai root, dan jalankan perintah lokkit dari prompt, nonaktifkan firewall dan SElinux dan lihat apakah Anda memiliki masalah yang sama.
Periksa juga izin Anda telah diatur dengan benar, sehingga semuanya dapat menulis ke lokasi yang benar.
sumber
Ada juga bug besar ini dalam versi 5.1.9 dari driver mysql-jdbc:
http://bugs.mysql.com/bug.php?id=47494
sumber
Ini juga dapat disebabkan oleh pengaturan proxy yang salah . Saya punya masalah ini mencoba untuk terhubung melalui jdbc ke contoh MySQL yang berjalan di alat virtual Parallels di Mac saya. Koneksi jdbc menggunakan pengaturan jaringan level sistem dan karena saya berada di belakang proxy SOCKS saya harus mengatur host MySql sebagai host non-proxy (misalnya, pada Mac Anda dapat mengonfigurasinya di Pengaturan-> Jaringan-> Lanjutan- > Proxy, dan akhirnya tambahkan nama host atau alamat IP di "Bypass proxy settings untuk Hosts dan Domains ini").
sumber
Konektor MySQL / J hanya mendukung TCP / IP Java tidak mendukung konektivitas soket domain Unix
Jika MYSQL dimulai dengan loncatan bendera jaringan atau jika MySQL berjalan di belakang firewall, maka opsi TCP / IP dinonaktifkan. Sehingga Java tidak dapat berkomunikasi dengan MySQL.
sumber
Saya memiliki masalah yang sangat mirip selama hampir sehari, dan itu membuat saya gila! tetapi saya berhasil menemukan solusinya, dan itu sangat, sangat sederhana, Anda hanya perlu /etc/init.d/tomcat6 untuk mengubah TOMCAT6_SECURITY = ya menjadi TOMCAT6_SECURITY = tidak. itu bukan solusi saya, saya menemukannya di sini , seperti yang Anda lihat, saya menjalankan ubuntu, harap ini berfungsi.
sumber
Saya memiliki masalah yang sama. Mengubah properti "bind-address" di file /etc/mysql/my.cnf menjadi 0.0.0.0, dan itu berfungsi. Baris yang sesuai di my.cnf terlihat seperti ini:
bind-address = 0.0.0.0
Sebelum diatur ke alamat ip luar server, jadi itu terlihat seperti:
bind-address = 196.152.4.145
Saya pikir ketika itu diatur ke alamat ip luar dan bukan loop localhost, server mysql hanya terhubung ke kartu jaringan dan tidak mendengarkan koneksi dari loop lokal.
sumber
coba alamat lokal Anda untuk mengikat alamat di file my.cnf
Koneksi con = nol;
sumber