2Danke
ERLEDIGT
JA
JA
ANTWORTEN
13
13
ZUGRIFFE
608
608
EMPFEHLEN
-
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 :1
Communications link failure
Ich verstehe nicht genau was das Problem ist. Aus den Fehlermeldungen werde ich nicht schlau.
mit:
hab ich eine genauere Fehlerausgabe, aber ich verstehe es immer noch nicht.Code :1
DriverManager.setLogWriter( new PrintWriter(System.out) );
Hier ist die daraus folgende Fehlermeldung:
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
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
-
22.08.11 10:48 #2
Hi,
ist dein Server gestartet und/oder ist der Port richtig?
Gruß
FabioBitte die Code-Tags verwenden. Bei Java-Code: [java]...[/java]
Tutorials:
Automatisches erzeugen eines Inhaltsverzeichnisses (Javascript)
JAnimationPanel - Animationen für Swing/AWT
SWTRatingBar (Bewertungs-Composite) selbst programmieren
____________________________________________________________________________
Über eine Bewertung (Stern links unter dem Beitrag) oder ein Danke freue ich mich sehr.
-
Hi airtime,
1. läuft denn überhaupt ein SQL-Server auf Port 3306 aud diesem Rechner?
2. Baust du die Verbindung so auf:
Code java:1 2 3 4 5 6 7 8 9 10 11
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
.
Also ich hab zu Testzwecken folgendermaßen die Verbindung aufgebaut:
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).Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
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(); } } }
Im classpath der jar file steht:
Code :1
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
-
22.08.11 11:42 #5
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ß
FabioBitte die Code-Tags verwenden. Bei Java-Code: [java]...[/java]
Tutorials:
Automatisches erzeugen eines Inhaltsverzeichnisses (Javascript)
JAnimationPanel - Animationen für Swing/AWT
SWTRatingBar (Bewertungs-Composite) selbst programmieren
____________________________________________________________________________
Über eine Bewertung (Stern links unter dem Beitrag) oder ein Danke freue ich mich sehr.
-
Hi nochmal,
Also die Dateinbank "mysql" existiert schon.?
DB erzeugen oder Tabellen zu "mysql" hinzufüen?die eine Datenbank aufbaut
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
bewirken?Code java:1 2
for ( Enumeration e = DriverManager.getDrivers(); e.hasMoreElements(); ) System.out.println( e.nextElement().getClass().getName() );
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
-
22.08.11 13:39 #8
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ß
FabioGeändert von Fabio Hellmann (22.08.11 um 13:48 Uhr)
Bitte die Code-Tags verwenden. Bei Java-Code: [java]...[/java]
Tutorials:
Automatisches erzeugen eines Inhaltsverzeichnisses (Javascript)
JAnimationPanel - Animationen für Swing/AWT
SWTRatingBar (Bewertungs-Composite) selbst programmieren
____________________________________________________________________________
Über eine Bewertung (Stern links unter dem Beitrag) oder ein Danke freue ich mich sehr.
-
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
-
22.08.11 16:04 #10SE Tutorials.de Gastzugang
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 :
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.Code java:1 2 3
Socket socket=new Socket("127.0.0.1", 3306); InputStream in=socket.getInputStream(); OutputStream out=socket.getOutputStream();
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-grundla...tallieren.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.
-
Hi,
@Spike vielen Dank für die ausführliche Antwort. Ich hatte schon einpaar Beiträge von dir gelesen auch den "dummy-klasse" kann aber nicht so den Sinn verstehen (Sorry bin noch in Sachen Datenbanken Anfänger).
Also zu den Gründen 1 und 2 habe ich mich geäußert (Server läuft und Port ist standard). Zu 3 ich nutze ubuntu und hab noch nie eine Firewall-Einstellung vorgenommen (Wäre cool zu wissen was man alles dort einstellen kann, gehört aber nicht in diesen Thread).
Zu "Class.forName() und JDBC-Driver" alle Beispiel/Tutorials die ich gelesen hab benutzen diese Syntax. Ich bin gerne bereit neues zu lernen und würde mich über einen link freuen der die neue Syntax einschließt.
Zu "Enumeration" ich wollte nur sehen ob ich den driver richtig eingebunden hab, hätte ja seien können das "Communication failure" aus gelöst wird weil er den driver nicht findet?
Zu "IP" ich hatte noch nie Probleme mit Host-name vor allem nicht bei unix-Systemen, aber gut zu wissen.
Zu "mysql in MySQL" gebe ich zu eine etwas doofe Frage, aber der User will nur helfen. Bitte nicht zu sehr darauf rumhacken.
So und ich habe mein Problem gelöst.
Zuerst hab ich in /etc/init.d/tomcat6 nachgeschaut ob die TOMCAT6_SECURITY=no ist, dem war so
.
Als nächstes hab ich die bind-addresse in etc/mysql/my.cnf auskommentiert und das war die Lösung.
Aber ich bin damit nicht ganz zufrieden, das ist doch nicht sicher oder? Mit dieser Einstellung hört der MySQL-Server alles?
Gruß Air
-
23.08.11 12:39 #12SE Tutorials.de Gastzugang
zum Auto-Load
Erstmal muss ich mich korrigieren ... so alt ist es dann doch noch nicht. Driver-Auto-Load wurde erst mit JDBC4 und damit mit Java6 eingeführt ... war mein Fehler.
Von offizieller Seite : http://today.java.net/pub/a/today/20...becomes-easier
Das so gut wie alle Seiten im Netz den alten Standard verwenden liegt entweder daran das diese aus der Zeit vor JDBC4 sind oder daran das sich die Autoren an solch alten orientiert oder es falsch gelernt haben. Auch könnte abwärtskompatibilität ein Grund sein.
Ganz nebenbei : wenn du Tomcat startest und dieser in seinem CP einen JDBC-Driver findet wird dieser eh für die gesamte Laufzeit geladen und kann somit natürlich von allen anderen Klassen verwendet werden ohne ihn selbst dierekt laden zu müssen. Ich würde also vorschlagen anstatt den MySQL-JDBC-Driver nur pro Projekt zu verwendet für den gesamten Tomcat-Server verfügbar machen.
Hmm ... zu klären wäre jetzt ob Tomcat unter Unix über einen File-Socket geht */var/etc/mysql.sock oder sowas ... keine Ahnung* oder über einen TCP-Socket *127.0.0.1:3306* und welches von beiden auf deinem Server überhaupt verfügbar ist bzw verwendet wird.
Wie sah denn die BIND-Zeile der Config vorher aus ? Weil ich kann es mir irgendwie nicht vorstellen das wenn du einer Server-Anwendung den Parameter für den Socket wegnimmst sich dann plötzlich eine andere verbinden kann. Oder stand in dieser Zeile eben der File-Socket welcher den TCP-Socket blockiert hat ?
Natürlich bin ich froh das es funktioniert ... aber warum gerade erst nach löschen der BIND-Zeile in der Config würde mich dann doch schon interessieren.
-
Hi Spike,
ich bin genauso verwundert wie du. Ich habe keine Ahnung wie ich das erklären kann, aber auf die Lösung bin ich darüber gekommen:
http://serverfault.com/questions/899...-or-externally
In der bind zeile war nur die IP des Computers (dieser hängt an einem größeren Netzwerk, also keine Standard_ip).
Zum Connector den hab ich in die ext von java gesteckt somit wird er doch für jedes java projekt genutzt?
Ich schätze das sehr das du dir so viel Zeit für mein Problem nimmst vielen Dank.
Gruß Air
-
23.08.11 15:01 #14SE Tutorials.de Gastzugang
Also davon ausgehend das diese Maschine eine Art "Server" sein soll sollte man eine statische IP zuweisen.
Was den Ort des JDBC-Drivers angeht : ja naja ... kann man für sich selbst so machen ... aber in nem produktivem Umfeld eher ungern gesehen.
Soweit ich den Link verstanden habe hat es was mit dem bound-to-interface und dem DNS-resolve zu tun. Dir das ganze jetzt so zu erklären das man es halbwegs versteht würde den Rahmen des Posts sprengen.
Ähnliche Themen
-
JDBC-Connector lädt nicht
Von pavlovski im Forum JavaAntworten: 4Letzter Beitrag: 18.01.10, 22:20 -
auslesen alle Table Name. MySQL, JDBC und Java
Von fanxin im Forum JavaAntworten: 7Letzter Beitrag: 23.08.07, 08:15 -
mit java jdbc auf mysql
Von J-P im Forum Relationale DatenbanksystemeAntworten: 0Letzter Beitrag: 27.12.04, 21:24 -
Jar File erzeugen aber so das mysql-connector-java-3.0.11-stable-bin.jar...
Von Wolfman im Forum JavaAntworten: 3Letzter Beitrag: 09.07.04, 13:35 -
Fragen zu Java&JDBC&MYSQL
Von ShadowSK im Forum JavaAntworten: 3Letzter Beitrag: 01.09.03, 11:05





Zitieren
Login





