Resolviendo una “falla en el enlace de comunicaciones” con JDBC y MySQL

Estoy intentando conectarme al servidor MySQL local, pero sigo recibiendo un error.

Aquí está el código.

public class Connect { public static void main(String[] args) { Connection conn = null; try { String userName = "myUsername"; String password = "myPassword"; String url = "jdbc:mysql://localhost:3306/myDatabaseName"; Class.forName("com.mysql.jdbc.Driver").newInstance(); conn = DriverManager.getConnection(url, userName, password); System.out.println("Database connection established"); } catch (Exception e) { System.err.println("Cannot connect to database server"); System.err.println(e.getMessage()); e.printStackTrace(); } finally { if (conn != null) { try { conn.close(); System.out.println("Database Connection Terminated"); } catch (Exception e) {} } } } } 

y los errores:

 Cannot connect to database server 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. 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. at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) at java.lang.reflect.Constructor.newInstance(Constructor.java:513) at com.mysql.jdbc.Util.handleNewInstance(Util.java:411) at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1116) at com.mysql.jdbc.MysqlIO.(MysqlIO.java:344) at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2333) at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2370) at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2154) at com.mysql.jdbc.ConnectionImpl.(ConnectionImpl.java:792) at com.mysql.jdbc.JDBC4Connection.(JDBC4Connection.java:47) at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) at java.lang.reflect.Constructor.newInstance(Constructor.java:513) at com.mysql.jdbc.Util.handleNewInstance(Util.java:411) at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:381) at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:305) at java.sql.DriverManager.getConnection(DriverManager.java:582) at java.sql.DriverManager.getConnection(DriverManager.java:185) at Connect.main(Connect.java:16) Caused by: java.net.ConnectException: Connection refused at java.net.PlainSocketImpl.socketConnect(Native Method) at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:351) at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:213) at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:200) at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366) at java.net.Socket.connect(Socket.java:529) at java.net.Socket.connect(Socket.java:478) at java.net.Socket.(Socket.java:375) at java.net.Socket.(Socket.java:218) at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:257) at com.mysql.jdbc.MysqlIO.(MysqlIO.java:294) ... 15 more 

Establecí el classpath, me aseguré de que mi.cnf tuviera la opción de skip network comentada.

La versión de Java es 1.2.0_26 (64 bit) mysql 5.5.14 mysql connector 5.1.17

Me aseguré de que el usuario tuviera acceso a mi base de datos.

He tenido el mismo problema en dos de mis progtwigs. Mi error fue esto:

 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. Trataré de contarle sobre diferentes enfoques y resumirlos aquí .

Mientras buscaba Internet para encontrar la solución a este error, descubrí que hay muchas soluciones que funcionaban 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 al conectarse al servidor . Tal vez el problema se deba a la cadena de consulta incorrecta o a demasiadas conexiones a la base de datos.

¡Entonces te sugiero que pruebes todas las soluciones una por una y no te rindas!

Estas son las soluciones que encontré en Internet y para cada una de ellas, al menos en persona, su problema ha sido resuelto con esa solución.

Consejo: 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 Archivos de progtwig)

Aquí están las soluciones:

  • cambiar el atributo “bind-address”

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

bind-address = “127.0.0.1”

o

bind-address = “0.0.0.0”

  • comentando “skip-networking”

Si hay una línea de “skip-networking” en su archivo de configuración de MySQL, hágala agregar agregando el signo “#” al comienzo de esa línea.

  • cambiar “wait_timeout” e “interactive_timeout”

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

wait_timeout = number

interactive_timeout = number

connect_timeout = número

  • Asegúrese de que Java no está traduciendo ‘localhost’ a [::: 1] en lugar de a [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:

Opción n. ° 1: en la cadena de conexión use 127.0.0.1 en lugar de localhost para evitar que localhost se traduzca a ::: 1

Opción n.º 2: ejecute Java con la opción -Djava.net.preferIPv4Stack = true para forzar a Java a usar IPv4 en lugar de IPv6. En Linux, esto también se puede lograr ejecutando (o colocándolo dentro de / etc / profile:

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

Asegúrese de que el Firewall o el software antivirus no esté bloqueando el servicio MySQL.

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

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

Detener 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 espacio de caracteres.

Intenta reemplazar “localhost” con la dirección de loopback 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 olvides cambiar el nombre de usuario y la contraseña por el nombre de usuario y la contraseña de tu servidor MySQL.

  • actualice su archivo de biblioteca de controlador 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 del 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

  • AutoReconnect

Agregue este código a su cadena de conexión:

 &autoReconnect=true&failOverReadOnly=false&maxReconnects=10 

Aunque ninguna de estas soluciones funcionó para mí, te sugiero que las pruebes. Porque hay algunas personas que resolvieron 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 creaba una conexión y luego la cerraba. 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 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 uso esa conexión. Resolvió mi problema y también aumentó mi velocidad dramáticamente.

Conclusión

No hay una manera simple y única de resolver este problema. Le sugiero que piense sobre su propia situación y elija las soluciones anteriores. Si toma este error al principio del progtwig y no puede conectarse a la base de datos, puede tener un problema en su cadena de conexión. Pero si toma este error después de varias interacciones exitosas a la base de datos, el problema podría ser con el número de conexiones y puede pensar en cambiar “wait_timeout” y otras configuraciones de MySQL o reescribir su código para reducir el número de conexiones.

Si está usando MAMP PRO, la solución fácil, que realmente me hubiera gustado haber descubierto antes de comenzar a buscar en Internet durante días tratando de resolver esto. Es realmente así de simple …

Simplemente tiene que hacer clic en “Permitir acceso a la red a MySQL” desde la pestaña MySQL de MAMP.

De verdad, eso es todo.

Ah, y DEBES tener que cambiar tu dirección de enlace a 0.0.0.0 o 127.0.0.1 como se describe en las publicaciones anteriores, pero al hacer clic en esa casilla solo probablemente resolverás tus problemas si eres un usuario de MAMP.

Establecer la bind-address a la IP de la red del servidor en lugar del predeterminado del localhost, y establecer privilegios en mi usuario funcionó para mí.

my.cnf:

 bind-address = 192.168.123.456 

Consola MySql:

 GRANT ALL PRIVILEGES ON dbname.* to username@'%' IDENTIFIED BY 'password'; 

Como dice la respuesta detallada anterior, este error puede deberse a muchas cosas.

También tuve este problema. Mi configuración fue Mac OSX 10.8, usando una VirtualBox VM administrada por Vagrant de Ubuntu 12.04, con MySQL 5.5.34.

Había configurado correctamente el reenvío de puertos en el archivo de configuración de Vagrant. Podría hacer telnet a la instancia de MySQL tanto desde mi Mac como desde dentro de la máquina virtual. Así que sabía que el daemon de MySQL se estaba ejecutando y accesible. Pero cuando traté de conectarme a través de JDBC, recibí el error “Error de enlace de comunicaciones”.

En mi caso, el problema se resolvió editando el archivo /etc/mysql/my.cnf. Específicamente, comenté la línea “# bind-address = 127.0.0.1”.

En mi caso fue un tiempo de espera inactivo, que causó la conexión se dejó caer en el servidor. La conexión se mantuvo abierta, pero no se usó durante un largo período de tiempo. Luego, el reinicio de un cliente funciona, aunque creo que una reconexión también funcionará.

Una solución no está mal es tener un daemon / servicio para hacer ping a la conexión de vez en cuando.

En mi caso,

  1. Cambie la configuración de la máquina remota mysql en /etc/mysql/my.cnf : cambie bind-address = 127.0.0.1 a #bind-address = 127.0.0.1

  2. En la máquina remota, cambie los permisos de usuario de mysql con GRANT ALL PRIVILEGES ON *.* TO 'user'@'%' IDENTIFIED BY 'password';

  3. IMPORTANTE: reinicie mysql en la máquina remota: sudo /etc/init.d/mysql restart

Para mí, la solución fue cambiar en el archivo conf del servidor mysql el parámetro bind-address = “127.0.0.1” o bind-address = “xxxx” para bind-address = “0.0.0.0”. Gracias.

Acabo de enfrentar el mismo problema. Sucedió porque el MySQL Daemon estaba vinculado a la IP de la máquina, lo cual es necesario para establecer una conexión con un usuario que tiene permiso para conectar @your_machine. En este caso, el usuario debe tener permiso para conectarse con USER_NAME @ MACHINE_NAME_OR_IP

Quería acceso remoto a mi máquina, así que cambié en my.cnf de

 bind-address = MY_IP_ADDRESS 

A

 bind-address = 0.0.0.0 

Lo cual permitirá que un usuario de localhost Y incluso fuera (en mi caso) se conecte a la instancia. Ambos permisos a continuación funcionarán si vincula el MySQL a 0.0.0.0:

 USER_NAME@MACHINE_NAME_OR_IP USER_NAME@localhost 

En mi caso (soy novato), estaba probando Servlet que hace conexión a la base de datos con MySQL y una de las excepciones es la mencionada anteriormente.

Hizo oscilar la cabeza durante algunos segundos, pero me di cuenta de que era porque no había iniciado mi servidor MySQL en localhost .
Después de iniciar el servidor, el problema se solucionó.

Por lo tanto, compruebe si el servidor MySQL se está ejecutando correctamente .

Sucede (en mi caso) cuando no hay suficiente memoria para MySQL. Un reinicio lo corrige, pero si ese es el caso, considere una nachine con más memoria, o limite la memoria tomada por jvms

Vaya a servicios de Windows en el panel de control e inicie el servicio MySQL. Para mí funcionó. Cuando estaba haciendo un proyecto Java EE, recibí este error “Error de enlace de comunicación”. Reinicié mi sistema y luego funcionó.

Después de eso, volví a tener el mismo error incluso después de reiniciar mi sistema. Luego traté de abrir la consola de línea de comandos de MySQL e iniciar sesión con Root, incluso entonces me dio un error.

Finalmente, cuando comencé el servicio MySQL desde los servicios de Windows, funcionó.

Tenía lo mismo. Quitar el puerto me ayudó en mi caso, así que lo dejé como jdbc: mysql: // localhost /

Si está utilizando hibernate, este error puede deberse a mantener abierto un objeto Session más tiempo que wait_timeout

He documentado un caso aquí para aquellos que estén interesados.

Encontré la solución

ya que MySQL necesita el Localhost para funcionar.

ve al archivo / etc / network / interfaces y asegúrate de que tienes configurada la configuración de localhost allí:

 auto lo iface lo inet loopback 

AHORA reinicie el subsistema de red y los servicios de MySQL:

sudo /etc/init.d/networking restart

sudo /etc/init.d/mysql restart

Pruebalo ahora

Es principalmente debido a la conexión débil entre el cliente mysql y el servidor remoto mysql.

En mi caso, es por una conexión VPN escamosa.

En phpstorm + vagrant, la opción del controlador autoReconnect ayudó.

La resolución proporcionada por Soheil fue exitosa en mi caso.

Para aclarar, el único cambio que necesitaba hacer era con la configuración del servidor de MySQL;

 bind-address = **INSERT-IP-HERE** 

Estoy usando un servidor MySQL externo para mi aplicación. Es una instalación básica de Debian 7.5 con MySQL Server 5.5 – configuración predeterminada.

IMPORTANTE:

Haga siempre una copia de seguridad del original de cualquier archivo de configuración que pueda modificar. Siempre ten cuidado cuando te eleven como super usuario.

Archivo

 /etc/mysql/my.cnf 

Línea

 bind-address = 192.168.0.103 #127.0.0.1 

Reinicie su servicio de servidor MySQL:

 /usr/sbin/service mysql restart 

Como puede ver, simplemente proporcioné la IP de red del servidor y comenté la entrada predeterminada. Tenga en cuenta que simplemente copiar y pegar mi solución no funcionará para usted, a menos que por algún milagro nuestros hosts compartan la misma IP.

Gracias @ Soheil

Estaba experimentando un problema similar y la solución para mi caso era

  1. cambiando bind-address = 0.0.0.0 desde 127.0.0.1
  2. cambiando el localhost de url a localhost: 3306

lo que sentí es que nunca deberíamos darnos por vencidos, intenté todas las opciones de esta publicación y también de otros foros … feliz de que funcione @saurab

Me enfrenté a este problema también.

Como Soheil sugirió, fui al archivo php.ini en la ruta C: \ windows \ php.ini, luego revisé el número de puerto en este archivo.

está en la línea mysqli.default_port = ……….

Así que lo cambié en mi aplicación java ya que está en el archivo php.ini, ahora funciona bien conmigo.

Sé que este es un hilo viejo pero he intentado varias cosas y he solucionado mi problema usando los siguientes medios.

Estoy desarrollando una aplicación multiplataforma en Windows pero para ser utilizada en servidores Linux y Windows.

Una base de datos MySQL llamada “jtm” instalada en ambos sistemas. Por alguna razón, en mi código tenía el nombre de la base de datos como “JTM”. En Windows funcionó bien, de hecho, en varios sistemas Windows que voló.

En Ubuntu, recibí el error una y otra vez. Lo probé con la caja correcta en el código “jtm” y funciona de maravilla.

Linux es, obviamente, mucho menos permisivo con respecto a la distinción entre mayúsculas y minúsculas (con razón), mientras que Windows hace concesiones.

Me siento un poco tonto ahora pero reviso todo. El mensaje de error no es el mejor pero parece arreglable si perseveras y haces las cosas bien.

Acabo de reiniciar MySQL (siguiendo un consejo desde aquí: https://stackoverflow.com/a/14238800 ) y resolvió el problema.

Tuve el mismo problema en MacOS (10.10.2) y MySql (5.6.21) instalado a través de homebrew.

Lo confuso fue que una de mis aplicaciones estaba conectada a la base de datos y la otra no.

Después de probar muchas cosas en la aplicación que arrojó la excepción com.mysql.jdbc.CommunicationsException tal como lo sugirió la respuesta aceptada de esta pregunta fue en vano, me sorprendió que el reinicio de MySQL funcionara.

La causa de mi problema podría haber sido la siguiente como se sugiere en la respuesta en el enlace mencionado anteriormente:

¿Estás usando el grupo de conexiones? En caso afirmativo, intente reiniciar el servidor. Probablemente, algunas de las conexiones en su grupo de conexiones estén en estado cerrado.

Para Windows: – Vaya al menú de inicio escribir, “Asistente de configuración de instancias de MySqlserver” y vuelva a configurar su instancia de servidor mysql. Espero que resolverá tu problema.

Después de años teniendo el mismo problema y sin solución permanente esto es lo que ha resuelto durante las últimas 3 semanas (que es un registro en términos de operación libre de errores)

establecer global wait_timeout = 3600;
establecer global interactive_timeout = 230400;

No olvides hacer esto permanente si funciona para ti.

En caso de que tenga problemas con un conjunto de contenedores Docker , asegúrese de no solo EXPOSE el puerto 3306 , sino también asignar el puerto desde el exterior del contenedor -p 3306:3306 . Para docker-compose.yml :

 version: '2' services: mdb: image: mariadb:10.1 ports: - "3306:3306" … 

Si está utilizando un emulador local, debe usar la dirección IP 10.0.2.2 en lugar de localhost para acceder a su servidor MySQL local.