java - sent - com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Error de enlace de comunicaciones
com mysql jdbc exceptions jdbc4 communicationsexception communications link failure (15)
Esta pregunta ya tiene una respuesta aquí:
Mi programa que se conecta a una base de datos MySQL estaba funcionando bien. Luego, sin cambiar ningún código usado para configurar la conexión, obtengo esta excepción:
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.
¿Que pasó?
El código utilizado para obtener la conexión:
private static Connection getDBConnection() throws SQLException, InstantiationException, IllegalAccessException, ClassNotFoundException {
String username = "user";
String password = "pass";
String url = "jdbc:mysql://www.domain.com:3306/dbName?connectTimeout=3000";
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection(url, username, password);
return conn;
}
Asegurarse de que la red de salteo esté comentada en my.cnf / my.ini
Como mencionó BalusC, sería muy útil publicar la stacktrace completa (siempre publicar una stacktrace completa, es inútil y frustrante tener solo las primeras líneas de un stacktrace).
De todos modos, mencionaste que tu código funcionaba bien y que este problema comenzó repentinamente sin ningún cambio de código, así que me pregunto si esto podría estar relacionado con tu otra pregunta. ¿ Problema al no cerrar la conexión de db durante la depuración? En realidad, si este problema comenzó durante la depuración, entonces creo que es (se quedó sin conexiones). En ese caso, reinicie su servidor de base de datos (y siga las sugerencias de la otra pregunta para evitar esta situación).
El problema esencial es que las conexiones de grupo de Mysql JDBC no se utilizan, luego Timeout from Mysql, cierra Connections. Necesita cambiar los Parámetros del grupo para obtener una conexión de reinicio cuando la conexión tenga fallas, de esta manera:
Connection Validation
: obligatorio (verificar)
Validation Method:
autocommit
¡Puede cambiar el Método de Validación si no puede hacerlo funcionar!
En mi caso, el Connector / J 5.1.29 .jar descargado por mysql.com tuvo este error mientras que el 5.1.29 .jar descargado del MvnRepository no lo hizo .
Esto sucedió al construir una aplicación appengine de Google en Android Studio (gradle, Windows x64), la comunicación a un servidor MySQL de Linux en la red local / VM local.
En mi caso, la interfaz loopback local no se inició, por lo que "localhost" no se pudo resolver. Puede verificar esto ejecutando "ifconfig" y debería ver una interfaz llamada "lo". Si no está activo, puede activarlo ejecutando "ifup lo" o "ifconfig lo up".
Esta es una excepción envuelta y no realmente interesante. Es la causa raíz de la excepción que realmente nos dice algo acerca de la causa raíz. Por favor, mira un poco más en la pila de stack. Es muy probable que se enfrente a una SQLException: Connection refused
o SQLException: Connection timed out
.
Si esto también es cierto en su caso, entonces todas las posibles causas son:
- La dirección IP o el nombre de host en la URL JDBC es incorrecto.
- El servidor DNS local no reconoce el nombre de host en JDBC URL.
- El número de puerto falta o está incorrecto en la URL JDBC.
- El servidor de bases de datos no funciona.
- El servidor de BD no acepta conexiones TCP / IP.
- Algo entre Java y DB está bloqueando las conexiones, por ejemplo, un firewall o proxy.
Para resolver el uno o el otro, siga los siguientes consejos:
- Verifíquelos y pruébelos con
ping
. - Actualice el DNS o use la dirección IP en la URL JDBC.
-
my.cnf
basado enmy.cnf
de MySQL DB. - Iniciarlo.
- Verifique si mysqld se inicia sin la opción
--skip-networking
. - Deshabilite el firewall y / o configure el firewall / proxy para permitir / reenviar el puerto.
Por cierto (y no relacionado con el problema real), no necesariamente es necesario cargar el controlador JDBC en cada llamada getConnection()
. Solo una vez durante el inicio es suficiente.
He tenido este problema también durante aproximadamente 8-9 días. Aquí hay algunos antecedentes: estoy desarrollando una aplicación Java simple que se ejecuta en bash.
Detalles:
- Spring 2.5.6
- Hibernate3.2.3.ga
- Con Maven. (La base del proyecto es de mkyong.com, el tutorial de primavera sin anotaciones)
- La versión de MySQL
[jvazquez@archbox ~]$ mysql --version mysql Ver 14.14 Distrib 5.5.9, for Linux (i686) using readline 5.1 Linux archbox 2.6.37-ARCH #1 SMP PREEMPT Fri Feb 18 16:58:42 UTC 2011 i686 Intel(R) Core(TM)2 Quad CPU Q8200 @ 2.33GHz GenuineIntel GNU/Linux
La aplicación funciona bien en Arch Linux, Mac OS X 10.6 y FreeBSD 7.2. Cuando moví el archivo jar a otro arch Linux en un host diferente, usando el mismo mysql, un my.cnf similar y la versión de kernel similar, la conexión murió y obtuvo el mismo error que el póster original:
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: error de enlace de comunicaciones
Probé todas las combinaciones posibles para esto que encontré en los foros ( http://forums.mysql.com/read.php?39,180347,180347#msg-180347 por ejemplo, que está cerrado ahora y puedo '' t publicación ...), específicamente:
- Comprobación triple de que no estaba usando la red de salto. (verificado con ps aux y my.cnf)
- Intenté habilitar log_warnings = 1 en my.cnf, pero obviamente, no estaba accediendo al servidor, así que no vi nada mientras usaba la aplicación
- MOSTRAR MOTOR innodb STATUS no mostró nada en absoluto; durante las pruebas pude conectarme a través de shell y php también conectado al servidor mysql
- / etc / hosts tiene localhost 127.0.0.1
- Intenté las propiedades jdbc usando localhost y 127.0.0.1 sin resultados
- Intentó agregar c3p0 y cambió el max_wait
- Las conexiones máximas en my.cnf se cambiaron a 900, 2000 y aún nada my.cnf
- Agregado wait_timeout = 60 my.cnf
- Se agregó net_wait_timeout = 360 my.cnf
- Se agregó el método destroy-method = "close" spring.xml
Como se señaló (si busca la misma excepción, encontrará varios hilos para el tema Reproduzca com.mysql.jdbc.exceptions.jdbc4.CommunicationsException con una configuración de Spring, hibernate y C3P0, por ejemplo).
- Si usa tomcat, verifique la excepción de seguridad (nuevamente, está en SO, lo encontrará)
- Compruebe que puede resolver esa url que está utilizando
- Intenta agregar c3p0.
- Verifique que no haya un firewall que rechace sus conexiones
- Finalmente, si está usando GNU / Linux (por ejemplo, ARch linux y de hecho obtiene esta excepción) Pruebe MySQL Forums :: JDBC y Java :: EOFException: No se puede leer la respuesta del servidor. Se espera que lea 4 bytes, lea 0 bytes antes de que la conexión se pierda inesperadamente
Si se elimina el enlace, simplemente agrega mysqld: ALL a /etc/hosts.allow
Sé que es un poco extenso , pero puede ayudar a cualquiera que use GNU / Linux y tenga esta excepción, y este hilo parece ser el mejor lugar para publicar mi investigación.
Espero eso ayude
Me encontré con el mismo problema. Estoy usando spring & dbcp & mysql 5.5 Pero si cambio localhost
a 192.168.1.110
entonces todo funciona. Lo que hace las cosas más raras es mysql -h localhost
simplemente funciona bien.
actualización: finalmente encontré una solución. Cambiar bindaddress a localhost
o 127.0.0.1
en my.conf
solucionará el problema.
Obtuve el error de error de comunicaciones al usar un java.sql.PreparedStatement con una declaración específica.
Esto se estaba ejecutando contra MySQL 5.6, Tomcat 7.0.29 y JDK 1.7.0_67 en una máquina con Windows 7 x64.
La causa resultó ser establecer un entero a un parámetro de cadena y una cadena a un parámetro entero y luego intentar ejecutar executeQuery en la instrucción preparada. Después de corregir el orden de configuración de parámetros, la instrucción se realizó correctamente.
Esto no tiene nada que ver con problemas de red como lo sugiere la redacción del mensaje de error.
Obtuve el mismo error, pero luego me di cuenta de que es porque el servidor Mysql no se está ejecutando en ese momento.
Entonces para cambiar el estado del servidor
- Ir al Administrador de tareas
- Ir a Servicios
- luego busca tu servidor Mysql (por ejemplo: para mi caso es MYSQL56)
- a continuación, verá debajo de la columna de estado que dice que no se está ejecutando
- haciendo clic derecho y selecciona inicio
Espero que esto ayude
Si usa WAMP, asegúrese de que esté en línea. Lo que hice fue apagar mi cortafuegos primero, luego funcionó, así que después de eso, autoricé la conexión para todos los puertos locales, especialmente el puerto 80. Luego me deshice de este problema. Para mí fue el Firewall quien estaba bloqueando la conexión.
Tenemos una pieza de software (aplicación web con Tomcat) que usa la agrupación de conexiones de Apache commons, y funcionó de maravilla durante años. En el último mes tuve que actualizar las bibliotecas debido a un viejo error que nos encontrábamos. El error había sido arreglado en una versión reciente.
Poco después de implementar esto, comenzamos a recibir exactamente estos mensajes. De las miles de conexiones que tendríamos un día, un puñado (menos de 10, por lo general) obtendría este mensaje de error. No había un patrón real, excepto que a veces se agrupaban en pequeños grupos de 2 a 5.
Cambié las opciones a en el grupo para validar la conexión cada vez que se toma o se vuelve a poner en el grupo (si se encuentra uno malo, se genera uno nuevo en su lugar) y el problema desapareció.
¿Has actualizado tu jar de MySQL últimamente? Parece que puede haber una nueva configuración que no solía estar allí en nuestro jar (ciertamente muy viejo).
Estoy de acuerdo con BalusC para probar algunas otras opciones en tu configuración, como las que estás pasando a MySQL (además del tiempo de espera de la conexión).
Si esta falla es transitoria como la mía fue, en lugar de permanente, entonces podría usar un simple try / catch y un loop para seguir intentándolo hasta que las cosas sucedan o use un grupo de conexiones para manejar ese detalle por usted.
Otra idea aleatoria: no sé qué sucede por qué intentas usar una conexión cerrada (qué excepción obtienes). ¿Podría estar cerrando accidentalmente la conexión en alguna parte?
Tuve el mismo problema y utilicé la mayoría de los parámetros (autoreconexión, etc.), pero no probé (test_on_idle, o test_on_connect), los voy a hacer a continuación.
Sin embargo, tuve este truco que me ayudó a superar esto:
Tengo un trabajo cron llamado Healthcheck. Se activa cada 10 minutos y realiza una llamada REST API al servidor. El servidor web / de aplicaciones recoge esto, se conecta al DB, realiza un pequeño cambio y regresa con un "sí, todo tranquilo en el frente occidental" o "shitshappening". Cuando este último, envía un buscapersonas / correo electrónico a las personas adecuadas.
Tiene el efecto secundario de mantener siempre fresco el conjunto de conexiones db. Mientras este cron se esté ejecutando, no tengo los problemas de tiempo de espera de conexión de DB. de lo contrario, surgen.
Veo que te estás conectando a un host remoto. Ahora la pregunta es qué tipo de red estás usando para conectarte a Internet.
WINDOWS
Si se trata de un dispositivo de banda ancha móvil, obtenga la dirección IP de su máquina y agréguela a su servidor de alojamiento para que su servidor pueda permitir las conexiones provenientes de su máquina. [Es posible que su host haya apagado esto por razones de seguridad]. Tenga en cuenta que cada vez que usa un dispositivo de red diferente, su IP cambia.
Si está utilizando una LAN, configure una dirección IP estática en su máquina y luego agréguela a su host.
¡¡Espero que esto ayude!! :)
verifica el tiempo de espera configurado en el servidor de bases de datos. Algunas veces, por defecto, es de 10 segundos. Esto pierde la conexión en 10 segundos.
mysql> show global variables like ''%time%'' ;
actualizarlo hacer algo así como 28800
mysql> SET GLOBAL wait_timeout = 28800;