MySQL + Java JDBC Connector

airtime

Mitglied
Hi,

ich hab schon einmal die Verbindung von Java zu MySQL über den JDBC Connector aufgebaut und hatte kaum Probleme (Sowohl standalone als auch mit Hilfe von eclipse). Mein Problem jetzt ist das ich auf einem neuen Rechner wieder die Verbindung aufbauen will.
Ich habe den Connector heruntergeladen eingebunden und möchte eine jar ausführen die eine Datenbank aufbaut. Jedoch kommt immer der Fehler:
Code:
Communications link failure

Ich verstehe nicht genau was das Problem ist. Aus den Fehlermeldungen werde ich nicht schlau.
mit:
Code:
DriverManager.setLogWriter( new PrintWriter(System.out) );
hab ich eine genauere Fehlerausgabe, aber ich verstehe es immer noch nicht.
Hier ist die daraus folgende Fehlermeldung:
Code:
DriverManager.getConnection("jdbc:mysql://localhost:3306/mysql")
    trying driver[className=com.mysql.jdbc.Driver,com.mysql.jdbc.Driver@3a3ee284]
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:532)
	at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
	at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1116)
	at com.mysql.jdbc.MysqlIO.<init>(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.<init>(ConnectionImpl.java:792)
	at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:47)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:532)
	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:620)
	at java.sql.DriverManager.getConnection(DriverManager.java:200)
	at LoadDriver.main(LoadDriver.java:50)
getConnection failed: 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.

Gruß Air
 
Hi airtime,

1. läuft denn überhaupt ein SQL-Server auf Port 3306 aud diesem Rechner?

2. Baust du die Verbindung so auf:
Java:
try{
    Class.forName("com.mysql.jdbc.Driver").newInstance();
    String url ="jdbc:mysql://localhost:3306/mysql";
    Connection con = DriverManager.getConnection(url, "root", "Passwort");
}
catch (ClassNotFoundException e){
    System.err.println(e.toString());
}
catch (Exception e){
    System.err.println(e.toString());
}

3. Soll dein Programm nun eine Dateinbank erzeugen, oder gibt es schon eine namens "mysql"

4. Wenn das Jar schon gepackt ist, was steht im Class-Path-Eintarag der Manifest-Datei, kann die Library überhaupt gefunden werden?

Gruß
 
Hi, vielen Dank für die schnellen Antworten. Sorry das ich viel zu wenig informationen gegeben hab :rolleyes:.
Also ich hab zu Testzwecken folgendermaßen die Verbindung aufgebaut:
Code:
public class LoadDriver
{
    public static void main(String[] args)
    {
        Connection conn = null;
        String url = "jdbc:mysql://localhost:3306/mysql";
        String user = "***";
        String pass = "***";
        
        for ( Enumeration e = DriverManager.getDrivers(); e.hasMoreElements(); )
        	  System.out.println( e.nextElement().getClass().getName() );
        
        try
        {
        	DriverManager.setLogWriter( new PrintWriter(System.out) );
        	Class.forName("com.mysql.jdbc.Driver");
        	conn = DriverManager.getConnection(url, user, pass);
        	System.out.println("Verbunden");
        }
        catch (Exception e)
        {
        	System.err.println("Kann nicht verbinden!");
        	e.printStackTrace();
        }
    }
}
Ich versuche auf die mysql Datenbank zuzugreifen, weil ich aus der commandozeile darauf zugreifen kann. Das heißt der Server läuft. Die Portnummer ist doch Standard für mysql/ConnectorJ (dachte ich).
Im classpath der jar file steht:
Code:
Class-Path: /usr/share/java/biojava1.7.1.jar /home/jordan/Software/mysql-connector-java-5.1.17/mysql-connector-java-5.1.17-bin.jar

Ich hoffe das beantwortet eure Fragen.

Gruß Air
 
Hi,
verusuchs mal, wenn du hinter dem "Class.forName(com.mysql.jdbc.Driver)" noch ein "getInstance()" setzt, so wie es javaDeveloper2011 geschrieben hat. Ansonsten schau mal auf diese Website, vielleicht hilft dir die weiter.

Gruß

Fabio
 
Hi nochmal,

Also die Dateinbank "mysql" existiert schon.?
die eine Datenbank aufbaut
DB erzeugen oder Tabellen zu "mysql" hinzufüen?

Ich denke mit dem Class-Path stimmt alles so weit, sonst kehmen wahrscheinlich auch andere Fehlermeldungen.
Ja, der Port 3306 ist standart.

Was soll eigentlich
Java:
for ( Enumeration e = DriverManager.getDrivers(); e.hasMoreElements(); )
    System.out.println( e.nextElement().getClass().getName() );
bewirken?

Gruß
 
Hi,

@ Fabio. Du meinst sicherlich newInstance(), hab ich schon probiert. Die Seite kenne ich zwar nicht hab aber schon etliche ähnliche durchgeschaut. Ich komme da einfach nicht weiter. Trotzdem danke, vielleicht hast du eine Ahnung was den Fehler auslösen kann.

@ javaDeveloper2011. Das Beispiel ist nur für die Verbindung gedacht, wenn es dann funktioniert werde ich das eigentliche Programme neu starten (das erzeugt dann eine neue Datenbank). Der Code Schnipsel zeigt mir an welche driver verfügbar sind (gehört zum debugging :))

Gruß Air
 
Hi,
du könntest noch versuchen, "localhost" durch "127.0.0.1" zu ersetzen. Da evtl. der Hostname nicht in eine IP-Adresse aufgelöst werden kann.

Gruß

Fabio
 
Zuletzt bearbeitet:
Hi,
hab ich auch schon probiert. Die standard sachen bei Communication failure hab ich probiert. Aber ich denke das ist irgendetwas anderes. Leider sind die Fehlermeldungen nicht sehr hilfreich. Vielleicht ist das ein Rechte Problem? Seit man bei appamore die Rechte für MySQL-Dateizugriffe definieren muss, könnte es sein das man für den Connector auch irgendwelche Rechte setzen muss?

Gruß Air
 
Wow ... also um hier mal einige Fehler auszuräumen geh ich eure Posts nach ein ander durch :

1) Diese Exception deutet auf ein Problem zwischen Java und MySQL hin. In aller Regel tritt so etwas auf wenn Java durch eine FireWall darin gehindert wird überhaupt eine Socket-Verbindung aufzubauen. Du solltest also zu aller erst mal in deiner FireWall nach sehen ob Java darin gesperrt ist.
Zum Test könntest du auch mal das hier testen :
Java:
Socket socket=new Socket("127.0.0.1", 3306);
InputStream in=socket.getInputStream();
OutputStream out=socket.getOutputStream();
Das ganze natürlich in einen try-catch ... sollten hier Exceptions fliegen weist du das du mit Java nicht mal eine Verbindung zum MySQL-Server aufbauen kannst.
Gründe :
1) Server läuft nicht
2) Server hat anderen Port
3) Java oder Server in FireWall blockiert


2) Class.forName() und JDBC-Driver
Also ich weis nicht wie aktuell ihr seit oder ob ihr es schon mal irgendwo gelesen habt. Ich habe es hier aber bestimmt schon mehr als einmal gepostet :

Seit Java1.4 / 5.0 *weis ich jetzt nicht genau* hat JDBC einen Autoloader. ALLE java.sql.Driver - Klassen die zum STARTZEITPUNKT der VM bekannt sind werden automatisch geladen. Damit fällt das viele Jahre verwendete Class.forName() komplett raus. Merkt euch das doch bitte endlich mal. Es ist doch keinen geholfen wenn ihm etwas beigebracht wird was seit 3 Versionen völlig veraltet ist.
VORISCHT : auf Grund der Tatsache das ein JDBC-Driver zum Startzeitpunkt der VM bekannt sein MUSS ist es nicht so einfach einen JDBC-Driver über einen URLClassLoader zu laden.
Dafür benötigt ihr eine Dummy-Klasse welche zum Start bekannt ist. Entsprechende Lösung hab ich hier schon mal gepostet : http://www.tutorials.de/java-grundlagen/372660-jdbc-treiber-installieren.html
Das solltest du eigentlich sogar noch kennen @ JavaDev


3) Enumeration über geladenen Driver
Ist es dir denn nicht aufgefallen das der com.mysql.jdbc.Driver bereits in dieser Liste steht noch BEVOR du ihn überhaupt mit Class.forName() geladen hast ? Du merkst : das bezieht sich auf Punkt 2
PS an die anderen : das ist im übrigen der Beweis für das was ich unter Punkt 2 geschrieben habe


4) IP statt Host-Namen
... sollte man sowieso immer berücksichtigen. Es ist nun einmal für den Rechner einfach gleich ein Ziel zu haben als erst eine Wegbeschreibung dahin zu erhalten. Allgemein ist auch bekannt das manche Linux-Distros sich bei Java , C und der gleichen manchmal weigern localhost aufzulösen obwohl es unter der Shell für z.B. ping funktioniert.


5) existiert auf einem MySQL die Datenbank "mysql" überhaupt
Also bitte ... was soll denn nun wieder diese Frage ? Die Datenbank MySQL ist quasi das Gehirn dieses Datenbanksystems. In ihr werden z.B. die User-Daten und -Rechte gespeichert. Außerdem : liegt es denn nicht nahe das einies mit dem anderen zu tun hat wenn beides den gleichen Namen hat ?



So ... ich hab jetzt mal meinen Senf abgegeben und hoffe das es irgendwie hilft. Ich würde auf jeden Fall erstmal die FireWall checken ob ich mit Java überhaupt Socket-Verbindungen aufbauen kann. Wenn das hinhaut weis man zumindest das es irgendwo im JDBC-Driver hakt.
 
Zurück