Datenbankverbindung mit Java klappt nicht

Bambino_Uno

Mitglied
Thread Starter
Dabei seit
03.04.2007
Beiträge
65
Reaktionspunkte
0
Hallo Community!:confused:

Ich mache gerade die ersten Gehversuche mit Datenbanken in Verbindung mit Java. Als DBMS nutze ich MySQL: ich habe es im Rahmen des MAMP-Paketes schon vor längerem installiert. Mit PHPmyAdmin habe ich eine DB namens 'firma' und eine Tabelle namen 'personen' erstellt.

Um diese DB von Java aus zu anzusprechen, installierte ich den Connector/J Driver und kopierte ihn nach '/Library/Java/Extension'. In Eclipse fügte ich die .jar Datei unter '-Projekt -Properties - exterene jar' hinzu.

Dann setzte ich folgenden Code auf, um auf die DB zuzugreifen:
Code:
package mysql;
import java.sql.*;
import java.io.*;

public class Test1 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		// Treiber laden
		
try{
	 Class.forName("com.mysql.jdbc.Driver");
	System.out.println("Treibe wurde erfolgreich geladen!");
}
catch (ClassNotFoundException e){
	System.out.println("Fehler beim Laden des JDBC-Treibers");
	return;
}


	String url ="jdbc:mysql:firma";
	String benutzername ="root";
	String passwort ="root";

	
	// Verbindung zur Datenbank aufbauen
	
	Statement befehl = null;
	Connection verbindung = null;
	
	try{
		verbindung = DriverManager.getConnection("jdbc:mysql://localhost/firma","root","root");
				
		befehl = verbindung.createStatement();
		
	}
	catch (Exception e){
		System.err.println("Verbindung zu " + url + " konnte nicht hergestellt werden");
		
	}
	
	}

}
Dann erscheint die Meldung: 'Treiber wurde erfolgreich geladen!
Verbindung zu jdbc:mysql:firma konnte nicht hergestellt werden '
. Der Fehler scheint also im try-Block zu liegen:

try{
verbindung = DriverManager.getConnection("jdbc:mysql://localhost/firma","root","root");
befehl = verbindung.createStatement();
}


Wisst Ihr wo mein Fehler liegt? Wie genau stellte ich die DB-Verbindung her? :kopfkratz:
 
Hallo!

Baue das letzte catch Statement mal etwas um, damit Du mehr Infos über den Fehler bekommst:

Code:
try
{
    Connection connection = DriverManager.getConnection(url, benutzername, kennwort);
    Statement statement = connection.createStatement();
    ResultSet resultset = statement.executeQuery("select * from test");
    while(resultset.next() == true)
    {
        String id = resultset.getString("id");
        String name = resultset.getString("name");
        System.out.println("id=" + id + ", name=" + name);
    }
}
catch (Exception e)
{
    System.err.println(e.getClass().getName() + ": " + e.getMessage());
    e.printStackTrace(); // die ausführliche Variante
}

Damit solltest Du dem Fehler besser auf die Schliche kommen! Ich vermute mal, das sich "root" nicht über localhost mit der MySQL verbinden darf.

Viele Grüße,
Christian
 
Hallo Christian!

Hab den Code umgeschrieben und damit eine Menge an Fehlermeldungen erhalten. Hier alle Meldungen:

Treiber wurde erfolgreich geladen!
com.mysql.jdbc.CommunicationsException: Communications link failure

Last packet sent to the server was 0 ms ago.
com.mysql.jdbc.CommunicationsException: Communications link failure

Last packet sent to the server was 0 ms ago.
at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1070)
at com.mysql.jdbc.Connection.createNewIO(Connection.java:2001)
at com.mysql.jdbc.Connection.<init>(Connection.java:716)
at com.mysql.jdbc.Connection.getInstance(Connection.java:291)
at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:266)
at java.sql.DriverManager.getConnection(DriverManager.java:525)
at java.sql.DriverManager.getConnection(DriverManager.java:171)
at mysql.Test1.main(Test1.java:37)
Caused by: java.net.ConnectException: Connection refused
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333)
at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:430)
at java.net.Socket.connect(Socket.java:516)
at java.net.Socket.connect(Socket.java:466)
at java.net.Socket.<init>(Socket.java:366)
at java.net.Socket.<init>(Socket.java:208)
at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:168)
at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:262)
at com.mysql.jdbc.Connection.createNewIO(Connection.java:1926)
... 6 more
 
Ok, here we go. Das hier ist der eigentlich wichtige Fehler:

java.net.ConnectException: Connection refused.

Kannst Du ein "telnet localhost 3306" machen? Das wäre der richtige Output, wenn mysql Verbindungen über tcp zuläßt:
Code:
$ telnet localhost 3306
Trying ::1...
telnet: connect to address ::1: Connection refused
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
A
5.0.19-standard-log#D)??`Dt=,?!p>$933GHu5D9^C

Wahrscheinlich ist in Deiner my.cnf der Eintrag "skip-networking" aktiv. Richtig? Das kannst Du in mysql auch mit
Code:
mysql> show variables like "skip-networking";
kontrollieren.

Viele Grüße,
Christian
 
Ich vermute mal, das sich "root" nicht über localhost mit der MySQL verbinden darf.
Wenn ich 'localhost' bei der url weglasse kommt folgende Fehlermeldung:

Treiber wurde erfolgreich geladen!
java.sql.SQLException: No suitable driver
java.sql.SQLException: No suitable driver
at java.sql.DriverManager.getConnection(DriverManager.java:545)
at java.sql.DriverManager.getConnection(DriverManager.java:171)
at mysql.Test1.main(Test1.java:36)
 
Ok, here we go. Das hier ist der eigentlich wichtige Fehler:

java.net.ConnectException: Connection refused.

Kannst Du ein "telnet localhost 3306" machen? Das wäre der richtige Output, wenn mysql Verbindungen über tcp zuläßt:
Code:
$ telnet localhost 3306
Trying ::1...
telnet: connect to address ::1: Connection refused
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
A
5.0.19-standard-log#D)??`Dt=,?!p>$933GHu5D9^C

Wahrscheinlich ist in Deiner my.cnf der Eintrag "skip-networking" aktiv. Richtig? Das kannst Du in mysql auch mit
Code:
mysql> show variables like "skip-networking";
kontrollieren.

Viele Grüße,
Christian

Danke für diese Info´s - aber ich checke jetzt überhaupt nix mehr!!!:confused:
 
'telnet localhost3306' ergibt bei mir folgende Ausgabe:
Trying ::1...
telnet: connect to address ::1: Connection refused
Trying 127.0.0.1...
telnet: connect to address 127.0.0.1: Connection refused
telnet: Unable to connect to remote host
 
Und mit
String url ="jdbc:mysql://127.0.0.1/firma";
als url kommt folgendes:

Treiber wurde erfolgreich geladen!
com.mysql.jdbc.CommunicationsException: Communications link failure

Last packet sent to the server was 0 ms ago.
com.mysql.jdbc.CommunicationsException: Communications link failure

Last packet sent to the server was 0 ms ago.
at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1070)
at com.mysql.jdbc.Connection.createNewIO(Connection.java:2001)
at com.mysql.jdbc.Connection.<init>(Connection.java:716)
at com.mysql.jdbc.Connection.getInstance(Connection.java:291)
at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:266)
at java.sql.DriverManager.getConnection(DriverManager.java:525)
at java.sql.DriverManager.getConnection(DriverManager.java:171)
at mysql.Test1.main(Test1.java:36)
Caused by: java.net.ConnectException: Connection refused
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333)
at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:430)
at java.net.Socket.connect(Socket.java:516)
at java.net.Socket.connect(Socket.java:466)
at java.net.Socket.<init>(Socket.java:366)
at java.net.Socket.<init>(Socket.java:208)
at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:168)
at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:262)
at com.mysql.jdbc.Connection.createNewIO(Connection.java:1926)
... 6 more
 
vorausgesetzt Du hattest ein Leerzeichen zwischen localhost und 3306 heißt das entweder das

(a) mysql nicht läuft
(b) ip remote connetcs nicht zulässig sind

was passiert denn bei einem lokalen connect mit

mysql -uDeinUserName -p

???
 
Ich hatte ein Leereichen zwischen localhost und 3306 gesetzt!

Bin Laie und Anfänger und weiß nicht wie man einen lokalen connect herstellt! Momentan fühle ich mich überhaupt etwas überfordert!

'mysql -uDeinUserName -p' ergibt 'command not found'

Aber: falls MySQL nicht läuft, - wie konnte ich dann eine DB mit PHPmyAdmin erstellen?
 
Aber: falls MySQL nicht läuft, - wie konnte ich dann eine DB mit PHPmyAdmin erstellen?

das heißt ja nur das es lief !

Also andere Frage: läuft mysql noch, meinetwegen auch per phpmyadmin?

Ansonsten ist der Zugriff auf DB's gut beschrieben bei der Javainsel
 
Hallo,

mein Vorschlag: nunächst mit der Kommandozeile bzw. mit MySQL Query Browser (ersteres gehört zum Lieferumfang von MySQL, letzteres gibts auf der WebSite von MySQL unter GUI-Werkzeuge) testen, ob MySQL läuft und mit welchen Parametern sich die Datenbanken ansprechen lassen.

Danach JDBC testen. Wichtig: es sollte mindestens Connector/J in der Version 5.0.5 installiert sein - die Version 5.0.4 gibt Fehler bei der Anmeldung...

Peter
 
Hallo nochmal,

habe mir Dein Programm noch einmal angeschaut und denke, es gibt noch einen Fehler im Verbindungsaufbau. Sende Dir mal den Code für ein kleines Testprogramm mit. Es orientiert sich an dem Beispiel von Horstmann/Cornell: Das Core-Java-2-Paket, Band 2.

Die Dateinamen musst Du natürlich ändern in database.properties und test.java. Wenn Du das ganze am Terminal ausprobieren willst, macht es Sinn, die bash_profile anzupassen; habe Dir die entsprechende Datei auch angehängt. Die Datei muss ins Benutzerverzeichnis und mit einem Punkt davor und ohne Punkt und txt dahinter gespeichert werden. Achtung: Wenn Du schon eine angepasste .bash_profile hast, die unbedingt vorher sichern bzw. die enstprechenden Änderungen dort vornehmen.

Die Fehlerquellen für eine Datenbankanbindung sind sehr vielfältig; deshalb mit ganz einfachen Mitteln anfangen und langsam ausbauen.

Peter
 
Hallo!

Kennst Du den MySQL Administrator aus dem MySQL Gui Tools?

http://dev.mysql.com/downloads/gui-tools/5.0.html

Im Administrator gibt es unter "Health" den Punkt "Server Variables", dann links "Connections -> Networking" und dann die Variable "skip_networking". Sorry, ich hatte mich in den ersten Postings vertan und den Unterstrich mit dem Bindestrich verwechselt. Welchen Wert hat die Variable bei Dir?

mysql_admin.png


Alternativ kannst Du auch über phpMyAdmin die folgende SQL Abfrage (show variables like "skip_networking") abschicken:

Code:
mysql> show variables like "skip_networking";
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| skip_networking | OFF   | 
+-----------------+-------+
1 row in set (0.00 sec)

Steht dann bei Dir ein On oder Off?

Viele Grüße,
Christian
 
Zuletzt bearbeitet:
Hallo Christian!
Habe die SQL Abfrage über phpMyAdmin gemacht: Resultat: OFF
Aber was ist daraus nun zu folgern...
 
Gerade habe ich den MySQL Query Browser installiert und versucht eine Verbindung herzustellen - leider ohne Erfolg und mit folgender Meldung:
Cant´t connect to local MySQL server through socket
'/tmp/mysql.sock' (2) (code 2002)


Ich habe die aus MAMP entnommenen Verbindungsparameter angegeben:
Host: localhost
Port: 8889
Benutzer: root
Kennwort: root

Übrigens: es wurde Connect/J 5.1 installiert.
 
Hallo,

das ist schon mal ungewöhnlich; MySQL hört normalerweise auf Port 3306.

Connect/J 5.1 ist ein Alpha-Release. Das würde ich an Deiner Stelle nicht verwenden...

Christian hat mit seinem Hinweis natürlich recht. Wenn Du jedoch MySQL aus dem Internet bezogen und wie in der mitglieferten Doku installiert und konfiguriert hast, dann sollten die Parameter passend gesetzt sein. Ansonsten gibt es sehr viele Kombinationen, an denen Du scheitern kannst.

Ich würde Dir empfehlen, die Einstellungen des Servers zu prüfen. Das von Dir erwähnte Tool PHP... kenne ich nicht; nutze den MySQL Administrator. Du solltest ein Datenbankschema anlegen, Benutzer definieren und deren Rechte und Zugangsdaten setzen. Dann ist es sicher hilfreich, das Tutorial für das Terminalprogramm mysql durchzuarbeiten. Da geht es um grundlegende Schritte; Du lernst die Grundlagen von SQL und testest nebenbei Deine Installation. Aus meiner Sicht macht es erst danach Sinn, sich mit Java und JDBC zu versuchen.

Peter
 
Das eigentlich merkwürdige ist doch aber, dass ich von PHP aus mit den angegebene Verbindungsparametern problemlos auf die DB zugreifen kann.
Dann kann es doch eigentlich nicht an MySQL liegen....
Ich werd´s noch mal mit einer anderen Connector/J - Version versuchen.

Aber im Prinzip hast Du natürlich recht: es ist sinnvoller sich zuerst mit den Grundlagen von SQL zu beschäftigen. Habe es bisher eher als Mittel zum Zweck betrachtet.
 
Hmmm... hast Du die Firewall unter Systemeinstellungen->Sharing->Firewall eingeschaltet?

Und dann könntest Du im phpMyAdmin einfach mal die folgende SQL Abfrage eingeben und das Ergebnis hier posten:

Code:
show variables;

Viele Grüße,
Christian
 
Zuletzt bearbeitet:
Zurück
Oben Unten