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