Mr.Schmidtdtdtdt: Datenbankverbindung schlägt fehl.

Hallo,

ich arbeite gerade an einem Java Applet welches wiederrum Daten aus einer Datenbank(MySQL) ausliest.
Ich verwende dafür den entsprechenden MySQL Treiber (Connector/J) in der aktuellen Version.

Lasse ich das ganze auf meinem eigenen Server laufen (Applet & Datenbank) funktioniert alles einwandfrei.

Lade ich das Applet auf einen anderen Server, behalte jedoch meinen MySQL Server bei, führt das zu follgender Fehlermeldung:

com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not create connection to database server.

LASSE ich das Applet auf meinem Testserver und gebe die remote Datenbank an, führt das ganze nach etwa 3-4 Sekunden Ladezeit zu dieser Fehlermeldung:

  
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.

Benutze ich sowohl den externen MySQL Server als auch den externen Server zum hosten des Applets, bekomme ich wieder die #1 Meldung:

om.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not create connection to database server.

Hiermit überprüfe ich die Datenbank Verbindung:

  
...  
try {  
	  controller.addChatLine("Connecting...");  
	  Class.forName("com.mysql.jdbc.Driver").newInstance();  
	  con = DriverManager.getConnection("jdbc:mysql://mysql.xxx.de/xxx?user=xxx&password=xxx");  
	  if(!con.isClosed()) {  
	    controller.addChatLine("Successfully connected to MySQL server...");  
	  }  
  
	} catch(Exception e) {  
		controller.addChatLine("Could not connect to MySQL server...");  
		controller.addChatLine(e.toString());  
	} finally {  
	  try {  
	    if(con != null) {  
	      con.close();  
	      controller.addChatLine("SQL connection closed...");  
	    }  
	  } catch(SQLException e) {}  
	}  
...

Ich weiß ehrlich gesagt gar nicht wo ich mit der Fehlersuche ansetzen soll und bin Dankbar für jeden Tipp.

Liebe Grüße,
Mr.Schmidtdtdtdt

  1. Hi!

    Lasse ich das ganze auf meinem eigenen Server laufen (Applet & Datenbank) funktioniert alles einwandfrei.

    Damit kann man aussagen, dass MySQL prinzipiell läuft. Eine Aussage zu richtigen Benutzernamen und Passwörtern lässt sich damit nicht machen, denn MySQL wertet als dritten Parameter noch den Host aus, von dem die Anfrage kommt. Das heißt, dass für einen erfolgreichen Connect in der Rechteverwaltung eine Kombination aus Nutzer, Passwort und dem anfragenden Host (% als Jokerzeichen ist möglich) vorhanden sein muss.

    Lade ich das Applet auf einen anderen Server, behalte jedoch meinen MySQL Server bei, führt das zu follgender Fehlermeldung:
    com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not create connection to database 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.

    Das ist doch kein Javascript-Code. Warum zeichnest du den Text als solchen aus? Der Meldungstext ist recht allgemein. Eventuell gibt es eingeschachtelte Exceptions, die einen genaueren Text ergeben. Jedenfalls ist für einen erfolgreichen Connect abgesehen von Löchern in Firewall noch notwendig, dass MySQL auch auf externe Verbindungswünsche reagiert. Welcher Port ist konfiguriert? Standard ist 3306. Es muss also mit

    netstat -plant

    ein Eintrag mit 0.0.0.0:3306 im lokalen Teil zu finden sein, der auf Listen steht. Ebenfalls richtig wäre die externe IP-Adresse des Servers, aber nicht 127.0.0.1. Eventuell sind andere Optionen für das netstat anzugeben. Benötigt wird n für numerische Ausgabe (keine Auflösung in Host- und Servicenamen) und a für alles (nicht nur stehende Verbindungen sondern auch lauschende Ports). (Ich seh grad, das l ist überflüssig, aber so kann ich mir die Parameter besser merken.)

    Eigentlich will man keinen offenen Datenbankserver, weswegen er von guten Admins so eingestellt wird, dass keine Verbindungen möglich sind.

    Lo!

    1. Hi,

      Damit kann man aussagen, dass MySQL prinzipiell läuft.
      Eine Aussage zu richtigen Benutzernamen und Passwörtern lässt sich damit
      nicht machen, denn MySQL wertet als dritten Parameter noch den Host aus,
      von dem die Anfrage kommt. Das heißt, dass für einen erfolgreichen
      Connect in der Rechteverwaltung eine Kombination aus Nutzer, Passwort
      und dem anfragenden Host (% als Jokerzeichen ist möglich) vorhanden sein
      muss.

      Gibt es diesbezüglich denn Unterschiede zu sagen wir mal irgendeinem PHP Script, welches mit der Datenbank arbeitet?
      Diese funktionieren nämlich auch NUR, wenn sie direkt auf dem remote Server liegen, auf welchem auch die Datenbank installiert ist.
      Lade ich nun jedoch das Applet auf eben diesen Server, schlägt die Verbindung zur selbigen Datenbank fehl.
      Beide Zugriffe (sowohl PHP als auch Java) finden also lokal statt und auch auf den selben Port.

      Das ist doch kein Javascript-Code. Warum zeichnest du den Text als
      solchen aus?

      Lediglich ein versehen.

      Der Meldungstext ist recht allgemein. Eventuell gibt es eingeschachtelte »» Exceptions, die einen genaueren Text ergeben.

      Gibt es eine Möglichkeit diese im laufenden Applet konkreter auszugeben?
      Die Meldungen die ich nun lokal im Eclipse habe sind schließlich die meiner eigenen Testumgebung.

      Jedenfalls ist für einen erfolgreichen Connect abgesehen von Löchern in »» Firewall noch notwendig, dass MySQL auch auf externe Verbindungswünsche »» reagiert. Welcher Port ist konfiguriert? Standard ist 3306.

      Warum extern? Das Applet wird im optimalfall auf dem selben Server gestartet wo auch die Datenbank liegt.
      Oder wird ein Java Applet generel "clientseitig" ausgeführt? Das wäre dann wohlgemerkt auch der besagte Unterschied zu PHP..
      Ist dem so? Ich gehe stark davon aus der die Datenbank externe Verbindungen nicht zulässt...

      1. Hi!

        Das heißt, dass für einen erfolgreichen Connect in der Rechteverwaltung eine Kombination aus Nutzer, Passwort und dem anfragenden Host (% als Jokerzeichen ist möglich) vorhanden sein muss.

        Gibt es diesbezüglich denn Unterschiede zu sagen wir mal irgendeinem PHP Script, welches mit der Datenbank arbeitet?

        Nein.

        Diese funktionieren nämlich auch NUR, wenn sie direkt auf dem remote Server liegen, auf welchem auch die Datenbank installiert ist.
        Lade ich nun jedoch das Applet auf eben diesen Server, schlägt die Verbindung zur selbigen Datenbank fehl.
        Beide Zugriffe (sowohl PHP als auch Java) finden also lokal statt und auch auf den selben Port.

        Sagtest du nicht, dass es auf dem selben Recher läuft? Wenn PHP läuft und Java nicht, ... ist denn der Connection-String richtig, also so, dass er lokal zugreift und kein vollständiger Hostname? (Wobei - ist ja nicht wie beim Apachen, wo Angaben mit und ohne http:// über internen oder externen Request entscheiden.)

        Der Meldungstext ist recht allgemein. Eventuell gibt es eingeschachtelte »» Exceptions, die einen genaueren Text ergeben.
        Gibt es eine Möglichkeit diese im laufenden Applet konkreter auszugeben?

        Ich kenne mich mit Java nicht aus, aber auch im Applet sollte man Exceptions fangen und deren Eigenschaften als Text irgendwohin ausgeben können.

        Warum extern? Das Applet wird im optimalfall auf dem selben Server gestartet wo auch die Datenbank liegt.
        Oder wird ein Java Applet generel "clientseitig" ausgeführt?

        Applets laufen im Client. Aber sie können ja ein Servlet auf dem Server kontaktieren, der die gewünschten Daten aus der intern erreichbaren Datenbank holt.

        Ich gehe stark davon aus der die Datenbank externe Verbindungen nicht zulässt...

        Man muss das nicht vermuten, das ist prüfbar.

        Lo!

  2. moin,

    Dein DB-Server ist nicht erreichbar. Entweder stimmt die Auflösung des Namen nicht (prüfe mit nslookup) oder eine Firewall blockt den Port.

    Es ist auch möglich, dass ein Application-Gateway den Zugang nur für bestimmte Anwendungen erlaubt.

    Hotti