Mysql
 sql >> Database >  >> RDS >> Mysql

Risoluzione di un errore di collegamento di comunicazione con JDBC e MySQL

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.

Ho impiegato diversi giorni per risolvere questo problema. Ho testato molti approcci che sono stati menzionati in diversi siti Web, ma nessuno di loro ha funzionato. Alla fine ho cambiato il mio codice e ho scoperto qual era il problema. Proverò a parlarti di diversi approcci e riassumeli qui .

Mentre stavo cercando su Internet la soluzione a questo errore, ho scoperto che ci sono molte soluzioni che funzionano per almeno una persona, ma altri 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 nella connessione al server . Forse il problema è dovuto alla stringa di query errata o alle 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.

Suggerimento:per le soluzioni di cui hai bisogno per modificare le impostazioni di MySQL, puoi fare riferimento ai seguenti file:

  • Linux:/etc/mysql/my.cnf o /etc/my.cnf (a seconda della distribuzione Linux e del pacchetto MySQL utilizzato)

  • Windows:C:\**ProgramData**\MySQL\MySQL Server 5.6\my.ini (Nota che è ProgramData, non Program Files)

Ecco le soluzioni:

  • cambiando bind-address attributo:

    Decommenta bind-address attribuirlo o modificarlo in uno dei seguenti IP:

     bind-address="127.0.0.1"
    

    o

     bind-address="0.0.0.0"
    
  • commentando "salta la rete"

    Se è presente un skip-networking riga nel tuo file di configurazione MySQL, fallo commentare aggiungendo # segno all'inizio di quella riga.

  • modifica "wait_timeout" e "interactive_timeout"

    Aggiungi queste righe al file di configurazione MySQL:

    [wait_timeout][1] = *number*
    
    interactive_timeout = *number*
    
    connect_timeout = *number*
    
  • Assicurati che Java non stia traducendo 'localhost' in [:::1] anziché in [127.0.0.1]

    Poiché MySQL riconosce 127.0.0.1 (IPv4 ) ma non :::1 (IPv6 )

    Questo potrebbe essere evitato utilizzando uno dei due approcci:

    1. Nella stringa di connessione usa 127.0.0.1 invece di localhost per evitare localhost in corso di traduzione in :::1

    2. Esegui java con l'opzione -Djava.net.preferIPv4Stack=true per forzare java a usare IPv4 invece di IPv6 . Su Linux, questo può essere ottenuto anche eseguendo (o inserendolo all'interno di /etc/profile :

       export _JAVA_OPTIONS="-Djava.net.preferIPv4Stack=true"
      
  • controlla le impostazioni proxy del sistema operativo, i firewall e i programmi antivirus

    Assicurati che il firewall o il software antivirus non stia bloccando il servizio MySQL.

    Arresta iptables temporaneamente su Linux. Se iptables non è configurato correttamente, può consentire l'invio di pacchetti tcp alla porta mysql, ma impedisce ai pacchetti tcp di tornare sulla stessa connessione.

     # Redhat enterprise and CentOS
     systemctl stop iptables.service
     # Other linux distros
     service iptables stop
    

    Arresta il software antivirus su Windows.

  • modifica stringa di connessione

    Controlla la tua stringa di query. la tua stringa di connessione dovrebbe essere qualcosa del genere:

    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 tua stringa. Tutta la stringa di connessione deve essere continua senza spazi.

Prova a sostituire "localhost" con l'indirizzo di loopback 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 nome utente e password del tuo server MySQL.

  • aggiorna il file della tua libreria di driver JDK
  • testare JDK e JRE diversi (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.

  • modifica 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 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 suggerisco 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 creavo una connessione e poi la chiudevo. Anche se chiudevo 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 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à.

#Conclusion#Non esiste un modo semplice e unico per risolvere questo problema. Ti suggerisco di pensare alla tua situazione e di scegliere le soluzioni di cui sopra. Se ricevi questo errore all'inizio del programma e non riesci a connetterti al database, potresti avere problemi nella stringa di connessione. Ma se prendi questo errore dopo diverse interazioni riuscite con il database, il problema potrebbe essere con il numero di connessioni e potresti pensare di cambiare "wait_timeout" e altre impostazioni di MySQL o riscrivere il tuo codice come questo riduce il numero di connessioni.