sql >> Base de Datos >  >> RDS >> Mysql

Resolviendo una falla en un enlace de comunicaciones con JDBC y MySQL

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.

Pasé varios días para resolver este problema. He probado muchos enfoques que se han mencionado en diferentes sitios web, pero ninguno funcionó. Finalmente cambié mi código y descubrí cuál era el problema. Intentaré informarle sobre diferentes enfoques y resumirlos aquí .

Mientras buscaba en Internet para encontrar la solución a este error, descubrí que hay muchas soluciones que funcionaron para al menos una persona, ¡pero otros dicen que no funciona para ellos! ¿Por qué hay muchos enfoques para este error? Parece que este error puede ocurrir generalmente cuando hay un problema en la conexión al servidor . Tal vez 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 una persona cuyo problema se ha resuelto con esa solución.

Sugerencia:para las soluciones que necesita para cambiar la configuración de MySQL, puede consultar los siguientes archivos:

  • Linux:/etc/mysql/my.cnf o /etc/my.cnf (según la distribución de Linux y el paquete MySQL utilizado)

  • Windows:C:\**ProgramData**\MySQL\MySQL Server 5.6\my.ini (Observe que es ProgramData, no Program Files)

Estas son las soluciones:

  • cambiando bind-address atributo:

    Descomente bind-address atributo o cámbielo a una de las siguientes direcciones IP:

     bind-address="127.0.0.1"
    

    o

     bind-address="0.0.0.0"
    
  • comentar "saltar redes"

    Si hay un skip-networking línea en su archivo de configuración de MySQL, haga que comente agregando # firmar al principio de esa línea.

  • cambiar "wait_timeout" e "interactive_timeout"

    Agregue estas líneas al archivo de configuración de MySQL:

    [wait_timeout][1] = *number*
    
    interactive_timeout = *number*
    
    connect_timeout = *number*
    
  • Asegúrese de que Java no esté traduciendo 'localhost' a [:::1] en lugar de [127.0.0.1]

    Dado que MySQL reconoce 127.0.0.1 (IPv4 ) pero no :::1 (IPv6 )

    Esto podría evitarse utilizando uno de dos enfoques:

    1. En la cadena de conexión, use 127.0.0.1 en lugar de localhost para evitar localhost siendo traducido a :::1

    2. Ejecute java con la opción -Djava.net.preferIPv4Stack=true forzar a java a usar IPv4 en lugar de IPv6 . En Linux, esto también podría lograrse ejecutando (o colocándolo dentro de /etc/profile :

       export _JAVA_OPTIONS="-Djava.net.preferIPv4Stack=true"
      
  • verifique la configuración del proxy del sistema operativo, los firewalls y los programas antivirus

    Asegúrese de que el firewall o el antivirus no estén bloqueando el servicio MySQL.

    Detenga iptables temporalmente en Linux. Si las iptables están mal configuradas, pueden permitir que los paquetes tcp se envíen al puerto mysql, pero bloquear los paquetes tcp para que no regresen a la misma conexión.

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

    Detenga el software antivirus en Windows.

  • cambiar 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 carácter de espacio.

Intente reemplazar "localhost" con la dirección de bucle invertido 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
  • prueba 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 la cantidad máxima de paquetes. Por lo tanto, no ayudará a resolver este error.

  • cambiar la seguridad de Tomcat

cambie TOMCAT6_SECURITY=yes a TOMCAT6_SECURITY=no

  • usar la propiedad de consulta de validación

use la validaciónQuery="seleccione ahora()" para asegurarse de que cada consulta tenga respuestas

  • Reconexión automática

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 solucionaron su problema siguiendo estos pasos.

¿Pero qué resolvió mi problema?

Mi problema era que tenía muchos SELECT en la base de datos. Cada vez que estaba creando una conexión y luego cerrándola. Aunque estaba cerrando la conexión cada vez, pero el sistema se enfrentó a muchas conexiones y me dio ese error. Lo que hice fue definir 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. Resolvió mi problema y también aumentó mi velocidad dramáticamente.

#Conclusión#No existe 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 para reducir la cantidad de conexiones.