2010-05-30 20 views
5

Estoy ejecutando Ubuntu y estoy tratando de conectar Tomcat a mi base de datos MySQL usando JDBC.No se puede conectar a MySQL con JDBC - Tiempo de espera de conexión - Ubuntu 9.04

Ha funcionado previamente pero después de un reinicio, la instancia ahora no se puede conectar.

  • Tanto Tomcat 6 y MySQL 5.0.75 están en la misma máquina
  • cadena de conexión: jdbc: mysql: /// localhost: 3306
  • puedo conectar a MySQL en la línea de comandos utilizando el mysql archivo de comandos
  • el my.cnf es bastante estándar (disponible bajo petición) se unen dirección: 127.0.0.1
  • no puedo telnet al puerto de MySQL a pesar netstat diciendo MySQL está escuchando
  • tengo una regla iptables para reenviar 80 -> 8080 y no tengo ningún servidor de seguridad del que tenga conocimiento.

Soy bastante nuevo en esto y no estoy seguro de qué más probar. No sé si debería buscar en etc/interfaces y si hice lo que debía buscar. Es extraño porque solía funcionar, pero después de reiniciar, está inactivo, así que debo haber cambiado algo ... :).

Me doy cuenta de que un tiempo de espera indica que el servidor no responde y supongo que es porque la solicitud no se está procesando. Instalé MySQL vía apt-get y Tomcat manualmente.

MYSQLD procesa

[email protected]:/var/log/mysql# ps -ef | grep mysqld 
root  21753  1 0 May27 ?  00:00:00 /bin/sh /usr/bin/mysqld_safe 
mysql 21792 21753 0 May27 ?  00:00:00 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --user=mysql --pid-file=/var/run/mysqld/mysqld.pid --skip-external-locking --port=3306 --socket=/var/run/mysqld/mysqld.sock 
root  21793 21753 0 May27 ?  00:00:00 logger -p daemon.err -t mysqld_safe -i -t mysqld 
root  21888 13676 0 11:23 pts/1 00:00:00 grep mysqld 

Netstat

[email protected]:/var/log/mysql# netstat -lnp | grep mysql 
tcp  0  0 0.0.0.0:3306   0.0.0.0:*    LISTEN  21792/mysqld 
unix 2  [ ACC ]  STREAM  LISTENING  1926205077 21792/mysqld  /var/run/mysqld/mysqld.sock 

Clase Toy Conexión

[email protected]:~# cat TestConnect/TestConnection.java 

import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.SQLException; 

public class TestConnection { 

    public static void main(String args[]) throws Exception { 
    Connection con = null; 

    try { 
     Class.forName("com.mysql.jdbc.Driver").newInstance(); 
     System.out.println("Got driver"); 
     con = DriverManager.getConnection(
       "jdbc:mysql:///localhost:3306", 
       "uname", "pass"); 
     System.out.println("Got connection"); 

     if(!con.isClosed()) 
     System.out.println("Successfully connected to " + 
      "MySQL server using TCP/IP..."); 

    } finally { 
     if(con != null) 
      con.close(); 
    } 
    } 
} 

Salida de clase de conexión de juguete

Nota: Este es el mismo error que obtengo de Tomcat.

[email protected]:~/TestConnect# java -cp mysql-connector-java-5.1.12-bin.jar:. TestConnection 
Got driver 
       Exception in thread "main" com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure 

The last packet sent successfully to the server was 1 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:409) 
     at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1122)    
     at TestConnection.main(TestConnection.java:14) 
Caused by: 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:409) 
     at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1122) 
     at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:344) 
     at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2181) 
     ... 12 more 
Caused by: java.net.ConnectException: Connection timed out 
     at java.net.PlainSocketImpl.socketConnect(Native Method) 
     ... 13 more 

Telnet salida

[email protected]:~/TestConnect# telnet localhost 3306 
Trying 127.0.0.1... 
telnet: Unable to connect to remote host: Connection timed out 

Respuesta

2

Netstat muestra que MySQL es, en efecto escuchando en el puerto 3306 en todas las direcciones locales. Como telnet no se puede conectar a 127.0.0.1, es un firewall que lo detiene; intente ejecutar sudo ufw default allow para deshabilitarlo de manera efectiva, o sudo ufw allow 3306 y vea si realiza algún cambio.

+0

Esto me llevó a la respuesta que era que la interfaz lo estaba abajo. * Cuelga la cabeza con vergüenza *. Un rápido 'ifconfig lo up' lo resolvió. – gav

0

La cadena de conexión debe ser

jdbc:mysql://localhost:3306 

en lugar de

jdbc:mysql:///localhost:3306 

También en Unix/Linux, por Por defecto, la comunicación entre el cliente y el servidor se realiza a través del archivo socket de Unix y no a través de tcp/ip. Por lo tanto, no puede hacer telnet al puerto 3306 en su máquina local.

+0

I ammended la cadena de conexión y sigue sin suerte. ¿Es posible conectarse a través de un socket usando Tomcat/Java? Tal vez nunca he podido conectarme a través de este puerto y tomcat solía usar el socket. – gav

+0

Parece que MySQL Connector/J no admite conexiones a través del socket Unix; solo admite conexiones a través de tcp/ip o pipes con nombre. Una opción simple será configurar su servidor MySQL para aceptar conexiones a través de tcp/ip. –

0

¿Siempre utilizó la misma firma para el método getConnection, o es una de las cosas que cambió antes de dejar de funcionar?(La '///' en las sugerencias de cuerda que era una adición reciente.)

Si esto es nuevo código, puede probar la siguiente cadena de conexión:

cadena dbUrl = "jdbc: mysql: // localhost: 3306/[db]? user = [user] & contraseña = [contraseña] "; Connection conn = DriverManager.getConnection (dbUrl);

Este es el formato de ejemplo de la página de documentación mysql.com:

http://dev.mysql.com/doc/refman/5.0/es/connector-j-usagenotes-basic.html

1

¿Cómo es tu archivo/etc/hosts? ¿Tiene una entrada como la siguiente?

127.0.0.1 localhost 

¿Se puede tratar de telnet:

telnet 127.0.0.1 3306 or telnet 127.0.0.1:3306 

o JDBC conectarse a:

jdbc:mysql://127.0.0.1:3306 
Cuestiones relacionadas