2010-05-30 9 views
5

Ich benutze Ubuntu und versuche letztendlich, Tomcat über JDBC mit meiner MySQL-Datenbank zu verbinden.Verbindung zu MySQL kann nicht mit JDBC hergestellt werden - Verbindungstimeout - Ubuntu 9.04

Es hat zuvor funktioniert, aber nach einem Neustart kann die Instanz jetzt keine Verbindung herstellen.

  • Sowohl Tomcat 6 und MySQL 5.0.75 sind auf der gleichen Maschine
  • Verbindungszeichenfolge: jdbc: mysql: /// localhost: 3306
  • ich MySQL auf der Kommandozeile verbinden können die mysql mit Befehl
  • die my.cnf ist ziemlich Standard (auf Anfrage) hat binden Adresse: 127.0.0.1
  • ich kann nicht mit dem MySQL-Port trotz netstat Telnet MySQL sagen hört
  • ich eine iptables-Regel haben weiterleiten 80 -> 8080 und keine Firewall die mir bekannt ist.

Ich bin ziemlich neu und ich bin mir nicht sicher, was noch zu testen. Ich weiß nicht, ob ich in etc/interfaces suchen sollte und ob ich was zu suchen habe. Es ist komisch, weil es früher funktioniert hat, aber nach einem Neustart ist es ausgefallen, also muss ich etwas geändert haben ... :).

Ich weiß, ein Timeout zeigt an, dass der Server nicht reagiert, und ich nehme an, es ist, weil die Anfrage nicht wirklich durchkommt. Ich habe MySQL über apt-get und Tomcat manuell installiert.

mysqld-Prozesse

[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 

Toy Connection-Klasse

[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(); 
    } 
    } 
} 

Spielzeug Verbindungsklasse Ausgabe

Hinweis: Dies ist der gleiche Fehler, den ich von Tomcat erhalte.

[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 Output

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

Antwort

2

Netstat zeigt, dass MySQL in der Tat auf Port 3306 auf allen lokalen Adressen abhört. Da Telnet keine Verbindung zu 127.0.0.1 herstellen kann, ist eine Firewall, die Sie stoppt - versuchen Sie, sudo ufw default allow laufen zu lassen, um es wirksam zu deaktivieren, oder und sehen Sie, ob es Änderungen vornimmt.

+0

Dies führte mich zu der Antwort, die war, dass die Lo-Schnittstelle ausgefallen war. * Hängt Kopf in Schande *. Ein kurzes "ifconfig lo up" sortierte es. – gav

0

Die Verbindungszeichenfolge sollte

jdbc:mysql://localhost:3306 

statt

jdbc:mysql:///localhost:3306 

auch auf Unix/Linux sein, durch Standardmäßig erfolgt die Client/Server-Kommunikation über die Unix-Socket-Datei und nicht über tcp/ip. Daher können Sie nicht auf Port 3306 auf Ihrem lokalen Computer telnet.

+0

ich die Verbindungszeichenfolge Fügte und noch kein Glück. Ist es möglich, über einen Socket mit Tomcat/Java zu verbinden? Vielleicht war ich nie in der Lage, über diesen Port und den Tomcat, der den Socket benutzt, eine Verbindung herzustellen? – gav

+0

Es scheint, dass der MySQL Connector/J Verbindungen über den Unix-Socket nicht unterstützt - er unterstützt nur Verbindungen über tcp/ip oder Named Pipes. Eine einfache Möglichkeit besteht darin, Ihren MySQL-Server so zu konfigurieren, dass er Verbindungen über tcp/ip akzeptiert. –

0

Haben Sie immer die gleiche Signatur für die getConnection-Methode verwendet, oder ist das eines der Dinge, die Sie geändert haben, bevor es aufgehört hat zu arbeiten?(Die '///' in den String Vorschläge war es ein neuer Zusatz.)

Wenn dieser neue Code ist, können Sie versuchen, die folgende Verbindungszeichenfolge:

String dbUrl = „jdbc: mysql: // localhost: 3306/[db]? user = [Benutzer] & password = [Kennwort] "; Verbindung conn = DriverManager.getConnection (dbUrl);

Dies ist das Beispiel-Format auf der mysql.com Dokumentationsseite:

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

1

Wie sieht Ihre Datei/etc/hosts aus? Haben Sie einen Eintrag wie den folgenden?

127.0.0.1 localhost 

Können Sie versuchen, Telnet:

telnet 127.0.0.1 3306 or telnet 127.0.0.1:3306 

oder JDBC-Verbindung zu:

jdbc:mysql://127.0.0.1:3306