No se puede conectar a mysql a través del conector JDBC a través de Tomcat o externamente


17

He instalado una instalación estándar de mysql 5.5, y aunque puedo conectarme al servicio mysql a través del comando mysql, y el servicio parece estar ejecutándose, no puedo conectarlo a través de spring + tomcat o desde un conector jdbc externo.

Estoy usando la siguiente URL:

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

con nombre de usuario / contraseña adecuados, pero recibo el siguiente mensaje:

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.

y tiros de gato:

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)

Que parece ser el mismo problema que si intento conectarme externamente.


Enfrenté este problema al intentar conectarme a través de java a mi base de datos mysql que se ejecuta en otro servidor en mi LAN. al ejecutar el mismo programa java en el servidor que ejecuta mysql, se conectaba sin problemas. desde la máquina externa pude conectarme a la base de datos mysql usando SQLYog por ejemplo (aunque primero tuve que cambiar el archivo my.cnf para vincular a 0.0.0.0 en lugar de a 127.0.0.1). La respuesta de Boden y el comentario sobre cambiar el conector JDBC me apuntaron en la dirección correcta. Cambié el conector JDBC a la última versión y de repente funcionó.
user2380870

Respuestas:


18

Esto puede suceder por una variedad de razones. Lo vi hace unas semanas, pero no recuerdo cuál fue la solución para mí.

1) Verifique la dirección a la que está vinculado mysql, probablemente sea 127.0.0.1 (solo), que creo que es la predeterminada (al menos en el servidor Ubuntu estándar). Tendrá que comentar el parámetro bind-address en my.cnf para enlazar a todas las direcciones disponibles (no puede elegir múltiples, es una o todas).

2) Si está vinculado a 127.0.0.1 y no puede conectarse usando "localhost", asegúrese de que no se resuelva en la dirección localhost de IPv6 en lugar de IPv4. (o simplemente use la dirección IP)

3) Verifique dos y tres veces el puerto en el que mysql está escuchando.

4) Asegúrese de estar utilizando el conector JDBC correcto para su JDK.

5) Asegúrese de que no está haciendo algo realmente tonto como iniciar mysql con --skip-networking.

Creo que mi primera sugerencia es la más prometedora ... de hecho, creo que fue allí donde la vi recientemente ... Intenté conectarme a MySQL de forma remota (también en Ubuntu 8.04).


Solo para agregar mi 2cent, el 4to funcionó para mí. ¡Gracias!
Janis Peisenieks

1
con respecto a "Deberá comentar el parámetro bind-address en my.cnf para vincular a todas las direcciones disponibles", el valor predeterminado ahora es escuchar solo en localhost, por lo que es posible que deba usar la línea "bind-address = 0.0. 0.0 "dentro de [mysqld].
Palo

13

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:

  • Linux: /etc/my.cnf

  • Windows: D: \ Archivos de programa \ mysql \ bin \ my.ini

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

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


¡Estaba teniendo este problema también! Pero inicialmente había cambiado mysql para escuchar el puerto 8888 en lugar del 3306. Entonces, la respuesta de @ sohail ayudó, ¡acabo de agregar el puerto 8888 a mi uri y funcionó! Muchas gracias

¡Esto resolvió mi problema! Con nuestra configuración de Vagrant Homestead, por alguna razón era vinculante para la dirección dada a la VM (10.0.2.15 en mi caso) en lugar de localhost.
Lander

1

Si está ejecutando una instalación de Linux, probablemente tenga lokkit bloqueando las comunicaciones entrantes, excepto a través de SSH.

Inicie sesión como root y ejecute el comando lokkit desde el indicador, desactive el firewall y SElinux y vea si tiene el mismo problema.

También verifique que sus permisos se hayan configurado correctamente, para que todo pueda escribir en las ubicaciones correctas.


Estoy ejecutando Ubuntu 8.04. Probablemente debería haber mencionado eso. ¿Tienes instrucciones específicas para esa distribución? Voy a googlear en un momento, pero pensé en preguntar primero.
Stefan Kendall

sudo ufw disable deshabilitará el firewall de Ubuntu
Stephen Thompson

Instalé ufw e intenté habilitar el puerto, pero sin dados.
Stefan Kendall

ufw e iptables ya estaban desinstalados. Pensé que ufw era una herramienta de administración que debía instalarse por separado. Efectivamente, "iptables" no produce dicho comando y parece que no se está ejecutando ningún servicio de iptables.
Stefan Kendall

Ok, finalmente, lo que he encontrado a menudo es que no habilitas mysql para escuchar en la interfaz eth0, y a menudo solo está en la interfaz localhost. Intenta lo siguiente. Cambie jdbc: mysql: //myserver.com: myport / mydb a jdbc: mysql: // localhost: myport / mydb si eso funciona, debe hacer lo siguiente dev.mysql.com/doc/refman/5.1/en/ can-not-connect-to-server.html
Stephen Thompson


1

Esto también puede ser causado por una configuración de proxy incorrecta . Tuve este problema al intentar conectarme a través de jdbc a una instancia de MySQL que se ejecuta en un dispositivo virtual Parallels en mi Mac. La conexión jdbc utiliza la configuración de red a nivel del sistema y, como estaba detrás de un proxy SOCKS, tuve que configurar el host MySql como un host no proxy (por ejemplo, en una Mac puede configurarlo en Configuración-> Red-> Avanzado- > Proxies y, finalmente, agregue el nombre de host o la dirección IP en "Evitar la configuración de proxy para estos hosts y dominios").


1

MySQL Connector / J solo admite TCP / IP Java no admite conectividad de sockets de dominio Unix

Si el MYSQL se inicia con un indicador de omisión de red o si MySQL se está ejecutando detrás del firewall, la opción TCP / IP está desactivada. Para que Java no pueda comunicarse con MySQL.


0

Tuve un problema muy similar durante casi un día, ¡y me volvió loco! pero logré encontrar la solución, y fue muy, muy simple, solo necesita /etc/init.d/tomcat6 para cambiar TOMCAT6_SECURITY = yes a TOMCAT6_SECURITY = no. no es mi solución, la encontré aquí , como pueden ver, estoy ejecutando ubuntu, espero que esto funcione.


0

Yo tuve el mismo problema. Cambió la propiedad "bind-address" en el archivo /etc/mysql/my.cnf a 0.0.0.0, y funciona. La línea correspondiente en my.cnf se ve así:

dirección de enlace = 0.0.0.0

Antes de que se configurara en la dirección IP externa del servidor, se veía algo así como:

dirección-enlace = 196.152.4.145

Creo que cuando está configurado en la dirección IP externa y no en el bucle localhost, el servidor mysql solo está conectado a la tarjeta de red y no escucha las conexiones del bucle local.


0

pruebe su dirección local para vincular la dirección en el archivo my.cnf

Conexión con = nulo;

    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();
    }
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.