Impossibile connettersi a mysql tramite il connettore JDBC tramite Tomcat o esternamente


17

Ho installato un'installazione stock mysql 5.5 e mentre posso collegarmi al servizio mysql tramite il comando mysql e il servizio sembra essere in esecuzione, non riesco a collegarmi tramite spring + tomcat o da un connettore jdbc esterno.

Sto usando il seguente URL:

jdbc:mysql://myserver.com:myport/mydb

con nome utente / password corretti, ma ricevo il seguente messaggio:

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.

e Tomcat lancia:

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)

Che sembra essere lo stesso problema di se provassi a connettermi esternamente.


Ho riscontrato questo problema quando ho cercato di connettermi tramite Java al mio database mysql che gira su un altro server nella mia LAN. durante l'esecuzione dello stesso programma java sul server che esegue mysql si stava connettendo senza problemi. dalla macchina esterna ho potuto connettermi al database mysql usando SQLYog per esempio (anche se prima ho dovuto cambiare il file my.cnf per legare a 0.0.0.0 anziché a 127.0.0.1). La risposta di Boden e il commento sul cambio del connettore JDBC mi hanno indicato la giusta direzione. Ho cambiato il connettore JDBC all'ultima versione e all'improvviso ha funzionato!
user2380870,

Risposte:


18

Questo può accadere per una serie di motivi. L'ho visto da solo alcune settimane fa ma non ricordo quale fosse la soluzione per me.

1) Verificare che l'indirizzo mysql sia associato, probabilmente è 127.0.0.1 (solo) che ritengo sia l'impostazione predefinita (almeno sul server Ubuntu standard). Dovrai commentare il parametro bind-address in my.cnf per associare a tutti gli indirizzi disponibili (non puoi sceglierne più, è uno o tutti).

2) Se è associato a 127.0.0.1 e non è possibile connettersi utilizzando "localhost", assicurarsi che non si risolva nell'indirizzo localhost IPv6 anziché in IPv4. (o usa semplicemente l'indirizzo IP)

3) Doppio e triplo controllo della porta su cui mysql è in ascolto.

4) Assicurati di utilizzare il connettore JDBC giusto per il tuo JDK.

5) Assicurati di non fare qualcosa di veramente stupido come avviare mysql con --skip-networking.

Penso che il mio primo suggerimento abbia la più promessa ... in effetti penso che sia lì che l'ho visto di recente ... Stavo cercando di connettermi a mysql da remoto (anche su Ubuntu 8.04).


Solo per aggiungere il mio 2 centesimi, il 4 ha funzionato per me. Grazie!
Janis Peisenieks,

1
per quanto riguarda "Dovrai commentare il parametro bind-address in my.cnf per eseguire il bind a tutti gli indirizzi disponibili", il valore predefinito ora è ascoltare solo su localhost, quindi potrebbe essere necessario utilizzare la riga "bind-address = 0.0. 0.0 "entro [mysqld].
Palo,

13

Ho avuto lo stesso problema in due dei miei programmi. Il mio errore è stato questo:

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.

Trascorro alcuni giorni per risolvere questo problema. Ho testato molti approcci che sono stati menzionati in diversi siti Web, ma non di questi ha funzionato. Alla fine ho cambiato il mio codice e ho scoperto qual era il problema. Proverò a parlarti di diversi approcci e li riassumo qui .

Mentre cercavo Internet per trovare la soluzione a questo errore, ho capito che ci sono molte soluzioni che hanno funzionato per almeno una persona, ma altre dicono che non funziona per loro! perché ci sono molti approcci a questo errore? Sembra che questo errore possa verificarsi generalmente quando si verifica un problema di connessione al server . Forse il problema è a causa della stringa di query errata o di troppe connessioni al database.

Quindi ti consiglio di provare tutte le soluzioni una per una e non mollare!

Ecco le soluzioni che ho trovato su Internet e per ognuna di esse c'è almeno una persona che ha risolto il suo problema con quella soluzione.

punto: per le soluzioni che è necessario modificare le impostazioni di MySQL, è possibile fare riferimento a quanto segue:

  • Linux: /etc/my.cnf

  • Windows: D: \ Programmi \ mysql \ bin \ my.ini

Ecco le soluzioni:

  • modifica dell'attributo "bind-address"

Rimuovere l'attributo "bind-address" o modificarlo in uno dei seguenti Ips:

bind-address = "127.0.0.1"

o

bind-address = "0.0.0.0"

  • commentando "skip-networking"

Se nel file di configurazione di MySQL è presente una riga "skip-networking", è possibile aggiungere un commento aggiungendo il segno "#" all'inizio di tale riga.

  • cambia "wait_timeout" e "interactive_timeout"

Aggiungi queste righe al file di configurazione di MySQL:

wait_timeout = numero

interactive_timeout = numero

connect_timeout = numero

  • controlla le impostazioni del proxy del sistema operativo

Assicurati che il software Fire wall o Anti virus non blocchi il servizio MySQL.

  • cambia la stringa di connessione

Controlla la stringa della query. la stringa di connessione dovrebbe essere simile a questa:

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

Assicurati di non avere spazi nella stringa. Tutta la stringa di connessione deve essere continua senza spazi.

Prova a sostituire "localhost" con la tua porta, come 127.0.0.1. Prova anche ad aggiungere il numero di porta alla stringa di connessione, ad esempio:

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

Di solito la porta predefinita per MySQL è 3306.

Non dimenticare di cambiare nome utente e password con il nome utente e la password del tuo server MySQL.

  • aggiorna il file della libreria del driver JDK
  • testare diversi JDK e JRE (come JDK 6 e 7)
  • non modificare max_allowed_packet

" max_allowed_packet " è una variabile nel file di configurazione di MySQL che indica la dimensione massima del pacchetto, non il numero massimo di pacchetti. Quindi non aiuterà a risolvere questo errore.

  • cambia la sicurezza di Tomcat

cambia TOMCAT6_SECURITY = sì in TOMCAT6_SECURITY = no

  • usa la proprietà validationQuery

usa validationQuery = "select now ()" per assicurarti che ogni query abbia delle risposte

  • Riconnessione automatica

Aggiungi questo codice alla stringa di connessione:

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

Sebbene nessuna di queste soluzioni abbia funzionato per me, ti consiglio di provarle. Perché ci sono alcune persone che hanno risolto il loro problema seguendo questi passaggi.

Ma cosa ha risolto il mio problema? Il mio problema era che avevo molti SELECT sul database. Ogni volta che ho creato una connessione e poi l'ho chiusa. Anche se ho chiuso la connessione ogni volta, ma il sistema ha dovuto affrontare molte connessioni e mi ha dato quell'errore. Quello che ho fatto è stato definire la mia variabile di connessione come una variabile pubblica (o privata) per l'intera classe e inizializzarla nel costruttore. Quindi ogni volta che ho appena usato quella connessione. Ha risolto il mio problema e ha anche aumentato notevolmente la mia velocità.

Conclusione

Non esiste un modo semplice e unico per risolvere questo problema. Ti suggerisco di pensare alla tua situazione e di scegliere le soluzioni sopra. Se si rileva questo errore all'inizio del programma e non si è in grado di connettersi al database, è possibile che si sia verificato un problema nella stringa di connessione. Ma se si rileva questo errore dopo diverse interazioni riuscite con il database, il problema potrebbe riguardare il numero di connessioni e si potrebbe pensare di modificare "wait_timeout" e altre impostazioni di MySQL o riscrivere il codice in modo da ridurre il numero di connessioni.


Ho avuto anche questo problema! Ma inizialmente avevo cambiato mysql per ascoltare la porta 8888 anziché 3306. Quindi, la risposta di @ sohail mi ha aiutato, ho appena aggiunto la porta 8888 al mio uri e ha funzionato! Grazie

Questo ha risolto il problema per me! Con la nostra installazione di Vagrant Homestead, per qualche motivo era vincolante per l'indirizzo fornito alla VM (nel mio caso 10.0.2.15) anziché localhost.
Lander,

1

Se stai eseguendo un'installazione Linux, probabilmente hai lokkit che blocca le comunicazioni in arrivo, tranne tramite SSH.

Accedi come root ed esegui il comando lokkit dal prompt, disabilita firewall e SElinux e verifica se hai lo stesso problema.

Controlla anche che le tue autorizzazioni siano state impostate correttamente, quindi tutto può scrivere nelle posizioni corrette.


Sto eseguendo Ubuntu 8.04. Probabilmente avrei dovuto dirlo. Hai istruzioni specifiche per quella distribuzione? Lo farò tra un momento, ma ho pensato di chiedere prima.
Stefan Kendall,

sudo ufw disable disabilita Ubuntu Firewall
Stephen Thompson il

Ho installato ufw e ho provato ad abilitare la porta, ma nessun dado.
Stefan Kendall,

ufw e iptables sono già stati disinstallati. Pensavo che uww fosse uno strumento di gestione che doveva essere installato separatamente. Abbastanza sicuro, "iptables" non fornisce tale comando e nessun servizio iptables sembra essere in esecuzione.
Stefan Kendall,

Ok finalmente la cosa che ho trovato spesso è che non abiliti mysql ad ascoltare sull'interfaccia eth0, e spesso è solo sull'interfaccia localhost. Prova quanto segue. Cambia jdbc: mysql: //myserver.com: myport / mydb in jdbc: mysql: // localhost: myport / mydb se funziona, devi fare quanto segue dev.mysql.com/doc/refman/5.1/en/ can-not-connect-to-server.html
Stephen Thompson,


1

Ciò può anche essere causato da impostazioni proxy errate . Ho riscontrato questo problema nel tentativo di connettermi tramite jdbc a un'istanza di MySQL in esecuzione in un'appliance virtuale Parallels sul mio Mac. La connessione jdbc utilizza le impostazioni di rete a livello di sistema e poiché ero dietro un proxy SOCKS ho dovuto impostare l'host MySql come host non proxy (ad esempio, su un Mac è possibile configurarlo in Impostazioni-> Rete-> Avanzate- > Proxy e infine aggiungere il nome host o l'indirizzo IP in "Ignora impostazioni proxy per questi host e domini").


1

MySQL Connector / J supporta solo TCP / IP Java non supporta la connettività dei socket di dominio Unix

Se MYSQL viene avviato con il flag skip-networking o se MySQL è in esecuzione dietro il firewall, l'opzione TCP / IP è disabilitata. In modo che Java non possa comunicare con MySQL.


0

ho avuto un problema molto simile per quasi un giorno e mi ha fatto impazzire! ma sono riuscito a trovare la soluzione, ed è stato molto, molto semplice, devi solo /etc/init.d/tomcat6 per cambiare TOMCAT6_SECURITY = yes in TOMCAT6_SECURITY = no. non è la mia soluzione, l'ho trovata qui , come puoi vedere, sto eseguendo Ubuntu, spero che funzioni.


0

Ho avuto lo stesso problema. Modificata la proprietà "bind-address" nel file /etc/mysql/my.cnf su 0.0.0.0 e funziona. La riga corrispondente in my.cnf è simile alla seguente:

bind-address = 0.0.0.0

Prima era impostato sull'indirizzo IP esterno del server, quindi sembrava qualcosa del tipo:

bind-address = 196.152.4.145

Penso che quando è impostato sull'indirizzo IP esterno e non sul loop localhost, il server mysql è appena connesso alla scheda di rete e non ascolta le connessioni dal loop locale.


0

prova il tuo indirizzo locale per associare l'indirizzo nel file my.cnf

Connessione con = null;

    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();
    }
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.