Tidak dapat terhubung ke mysql melalui konektor JDBC melalui Tomcat atau secara eksternal

17

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.

Stefan Kendall
sumber
Saya menghadapi masalah ini ketika mencoba terhubung melalui java ke database mysql saya yang berjalan di server lain di LAN saya. ketika menjalankan program java yang sama pada server yang menjalankan mysql itu terhubung tanpa masalah. dari mesin eksternal saya dapat terhubung ke database mysql menggunakan SQLYog misalnya (meskipun saya pertama kali harus mengubah file my.cnf untuk mengikat ke 0.0.0.0 daripada 127.0.0.1). Jawaban Boden dan komentar tentang mengubah konektor JDBC menunjuk saya ke arah yang benar. Saya mengubah konektor JDBC ke versi terbaru dan tiba-tiba berfungsi!
user2380870

Jawaban:

18

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).

Boden
sumber
Hanya untuk menambahkan 2cent saya, yang ke-4 bekerja untuk saya. Terima kasih!
Janis Peisenieks
1
tentang "Anda harus mengomentari parameter bind-address di my.cnf untuk mengikat ke semua alamat yang tersedia", defaultnya sekarang adalah hanya mendengarkan di localhost, jadi Anda mungkin perlu menggunakan baris "bind-address = 0,0. 0,0 "dalam [mysqld].
Palo
13

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:

  • Linux: /etc/my.cnf

  • Windows: D: \ Program Files \ mysql \ bin \ my.ini

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.

  • ubah 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.

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

  • AutoReconnect

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.

Soheil
sumber
Saya juga mengalami masalah ini! Tapi saya awalnya mengubah mysql untuk mendengarkan port 8888 bukan 3306. SO, jawaban @ sohail membantu, saya baru saja menambahkan port 8888 ke uri saya dan berhasil! Terima kasih banyak
Ini memecahkan masalah bagi saya! Dengan setup Vagrant Homestead kami karena suatu alasan mengikat ke alamat yang diberikan kepada VM (10.0.2.15 dalam kasus saya) bukan localhost.
Lander
1

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.

Stephen Thompson
sumber
Saya menjalankan Ubuntu 8.04. Saya mungkin harus menyebutkan itu. Apakah Anda memiliki instruksi khusus untuk distro itu? Saya akan google sebentar lagi, tapi saya pikir saya akan bertanya dulu.
Stefan Kendall
sudo ufw disable akan menonaktifkan Ubuntu Firewall
Stephen Thompson
Saya menginstal ufw dan mencoba mengaktifkan port, tetapi tidak ada dadu.
Stefan Kendall
ufw dan iptables sudah dihapus. Saya pikir ufw adalah alat manajemen yang harus diinstal secara terpisah. Benar saja, "iptables" tidak menghasilkan perintah seperti itu, dan sepertinya tidak ada layanan iptables yang berjalan.
Stefan Kendall
Ok akhirnya yang sering saya temukan adalah Anda tidak mengaktifkan mysql untuk mendengarkan pada antarmuka eth0, dan sering hanya pada antarmuka localhost. Coba yang berikut ini. Ubah jdbc: mysql: //myserver.com: myport / mydb ke jdbc: mysql: // localhost: myport / mydb jika itu berfungsi, Anda perlu melakukan dev.mysql.com/doc/refman/5.1/en/ can-not-connect-to-server.html
Stephen Thompson
1

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").

Simone Bruno
sumber
1

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.

Sankar.lp.gym
sumber
0

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
0

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
0

coba alamat lokal Anda untuk mengikat alamat di file my.cnf

Koneksi con = nol;

    try {
        Class.forName("com.mysql.jdbc.Driver");
        con = DriverManager.getConnection("jdbc:mysql://x62.xx8.x4x.x5:3306/mydb", "root", "root");
        try {
            System.out.println(con.getMetaData());
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    } catch (ClassNotFoundException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
ozgun bayrak
sumber