He tenido el mismo problema en dos de mis programas. Mi error fue este:
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.
Paso algunos días para resolver este problema. He probado muchos enfoques que se han mencionado en diferentes sitios web, pero ninguno de ellos funcionó. Finalmente cambié mi código y descubrí cuál era el problema. Trataré de contarte sobre diferentes enfoques y resumirlos aquí .
Mientras buscaba internet para encontrar la solución a este error, descubrí que hay muchas soluciones que funcionaron para al menos una persona, ¡pero otras dicen que no funciona para ellas! ¿Por qué hay muchos enfoques para este error?
Parece que este error puede ocurrir generalmente cuando hay un problema al conectarse al servidor . Quizás el problema se deba a una cadena de consulta incorrecta o a demasiadas conexiones a la base de datos.
¡Así que te sugiero que pruebes todas las soluciones una por una y no te rindas!
Aquí están las soluciones que encontré en Internet y para cada una de ellas, hay al menos en persona que su problema se ha resuelto con esa solución.
punto: para las soluciones que necesita para cambiar la configuración de MySQL, puede hacer referencia a lo siguiente no:
Aquí están las soluciones:
- cambiando el atributo "bind-address"
Descomente el atributo "bind-address" o cámbielo a uno de los siguientes Ips:
bind-address = "127.0.0.1"
o
bind-address = "0.0.0.0"
- comentando "skip-networking"
Si hay una línea de "omisión de redes" en su archivo de configuración de MySQL, haga comentarios agregando el signo "#" al principio de esa línea.
- cambiar "wait_timeout" y "interactive_timeout"
Agregue estas líneas al archivo de configuración de MySQL:
wait_timeout = número
interactive_timeout = número
connect_timeout = número
- comprobar la configuración del proxy del sistema operativo
Asegúrese de que el Firewall o el software antivirus no bloqueen el servicio MySQL.
- cambiar la cadena de conexión
Verifique su cadena de consulta. su cadena de conexión debería ser algo como esto:
dbName = "my_database";
dbUserName = "root";
dbPassword = "";
String connectionString = "jdbc:mysql://localhost/" + dbName + "?user=" + dbUserName + "&password=" + dbPassword + "&useUnicode=true&characterEncoding=UTF-8";
Asegúrate de no tener espacios en tu cadena. Toda la cadena de conexión debe continuar sin ningún espacio de caracteres.
Intente reemplazar "localhost" con su puerto, como 127.0.0.1. También intente agregar el número de puerto a su cadena de conexión, como:
String connectionString = "jdbc:mysql://localhost:3306/my_database?user=root&password=Pass&useUnicode=true&characterEncoding=UTF-8";
Por lo general, el puerto predeterminado para MySQL es 3306.
No olvide cambiar el nombre de usuario y la contraseña por el nombre de usuario y la contraseña de su servidor MySQL.
- actualice su archivo de biblioteca de controladores JDK
- probar diferentes JDK y JRE (como JDK 6 y 7)
- no cambie max_allowed_packet
" max_allowed_packet " es una variable en el archivo de configuración de MySQL que indica el tamaño máximo de paquete, no el número máximo de paquetes. Por lo tanto, no ayudará a resolver este error.
- cambiar la seguridad de tomcat
cambie TOMCAT6_SECURITY = yes a TOMCAT6_SECURITY = no
- use la propiedad validationQuery
use validationQuery = "select now ()" para asegurarse de que cada consulta tenga respuestas
Agregue este código a su cadena de conexión:
&autoReconnect=true&failOverReadOnly=false&maxReconnects=10
Aunque ninguna de estas soluciones funcionó para mí, le sugiero que las pruebe. Porque hay algunas personas que resolvieron su problema siguiendo estos pasos.
¿Pero qué resolvió mi problema? Mi problema fue que tenía muchos SELECT en la base de datos. Cada vez que creé la conexión y luego la cerré. Aunque cerré la conexión cada vez, pero el sistema se enfrentó a muchas conexiones y me dio ese error. Lo que hice fue que definí mi variable de conexión como una variable pública (o privada) para toda la clase y la inicialicé en el constructor. Luego, cada vez que usé esa conexión. Solucionó mi problema y también aumentó mi velocidad dramáticamente.
Conclusión
No hay una forma simple y única de resolver este problema. Le sugiero que piense en su propia situación y elija las soluciones anteriores. Si toma este error al comienzo del programa y no puede conectarse a la base de datos, es posible que tenga un problema en su cadena de conexión. Pero si toma este error después de varias interacciones exitosas con la base de datos, el problema podría estar relacionado con la cantidad de conexiones y puede pensar en cambiar "wait_timeout" y otras configuraciones de MySQL o reescribir su código de manera que eso reduzca la cantidad de conexiones.