# Datenbankverbindung Java MySQL Exception



## Eisscholle (14. Jul 2007)

Hallo,

ich will mit folgendem Teilprogramm die Verbindung zu meiner lokalen Datenbank aufbauen:



```
public class Mysql
  {

  public static void main( String[] argv )
    {

    String treiber=null, DbUrl=null ;

    treiber = "org.gjt.mm.mysql.Driver" ;

    DbUrl = "jdbc:mysql://localhost:3306/test";

     try {
	 
         Class.forName( treiber ).newInstance();
	  	 System.out.println("geht noch");
         Connection cn = DriverManager.getConnection( DbUrl, "root", "****" );
	  System.out.println("geht nicht mehr");
```

Lokal funktioniert es super. Auf meinem Server geht er mir hiermit krachen:


```
geht noch
java.sql.SQLException: Access denied for user 'benutzername'@'servername.de' (using password: YES)
        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:946)
        at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2934)
        at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:870)
        at com.mysql.jdbc.MysqlIO.secureAuth411(MysqlIO.java:3333)
        at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1232)
        at com.mysql.jdbc.Connection.createNewIO(Connection.java:2749)
        at com.mysql.jdbc.Connection.<init>(Connection.java:1553)
        at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:285)
        at java.sql.DriverManager.getConnection(DriverManager.java:582)
        at java.sql.DriverManager.getConnection(DriverManager.java:185)
        at Mysql.main(Mysql.java:27)
```
Zeile 27 ist 
	
	
	
	





```
Connection cn = DriverManager.getConnection( DbUrl, "root", "****" );
```
.

Scheinbar spinnt mein Passwort. Jetzt habe ich mit PHP ein kleines Skript gemacht. Host, Passwort und Benutzername identisch zum Java-Programm. Und dort geht es! Wieso??? Das einzige was mich verwundert, ist dass er in der ersten Zeile der Fehlermeldung aus localhost die wirkliche Serverdomain (servername.de) macht. Nun habe ich schonmal unter phpmyadmin, DB mysql, Tabelle user irgendwie den Host geändert aber nix brachte es. Es steht dort jetzt wieder localhost. Als anderer Benutzer habe ich es auch probiert - geht nicht mit Java. Wo hat der da ein allg. Problem?

Danke!

VG


----------



## Eisscholle (14. Jul 2007)

Hi,

hat keiner eine Idee? ich habe jetzt sogar noch einen anderen Treiber probiert und in meine Tabelle user von mysql unter host zu meinem Usernamen alles mögliche eingetragen. Nix funktioniert! Irgendwelche Tipps etc., was ich noch überprüfen kann?

Danke!


----------



## Guest (15. Jul 2007)

```
GRANT SELECT, UPDATE ON deinedb.* TO 'benutzername'@'servername.de' IDENTIFIED BY 'Passwort'
```


----------



## Eisscholle (15. Jul 2007)

Hi,

jetzt bin ich schon ein Stück weiter, weiß aber immer noch nicht wieso er jetzt hängt.

Gleicher Code wie oben, Fehler ist jetzt:


```
com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: Access denied for user 'benutzer1'@'vserver.server.de' to database 'benutzer1'
        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:936)
        at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2934)
        at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:870)
        at com.mysql.jdbc.MysqlIO.secureAuth411(MysqlIO.java:3333)
        at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1232)
        at com.mysql.jdbc.Connection.createNewIO(Connection.java:2749)
        at com.mysql.jdbc.Connection.<init>(Connection.java:1553)
        at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:285)
        at java.sql.DriverManager.getConnection(DriverManager.java:582)
        at java.sql.DriverManager.getConnection(DriverManager.java:185)
        at Mysql.main(Mysql.java:27)
```
Datenbankname und Benutzername sind gleich....
Zeile 27 dabei:


```
Connection cn = DriverManager.getConnection( DbUrl, "benutzer1", "passwort" );
```

DbUrl:


```
DbUrl = "jdbc:mysql://vserver.server.de:3306/benutzer1";
```

Bei phpmyadmin kann man ja die Rechte wunderbar ablesen. Die lauten bei mir:


```
Benutzer | Host | Passwort | Globale Rechte | Grant
benutzer1   %                        Ja      ALL PRIVILEGES   	Ja
benutzer1   localhost 	            Ja 	   ALL PRIVILEGES 	Ja
benutzer1   vserver 	           Ja 	  ALL PRIVILEGES 	Ja
benutzer1   vserver.server.de  Ja    ALL PRIVILEGES 	Ja
```

In der Tabelle db von mysql steht wieder das gleiche. Jeweils für den Host und den benutzer1 und kompletten Zugriff. Aber wieso lässt der mich dann nicht auf die DB zugreifen? Mit PHP gehts ja.

Danke.


----------



## Eisscholle (15. Jul 2007)

hat jmd. zufällig noch eine Idee oder kann sich mit mir auf Fehlersuche begeben? Weil ich ahbe bis jetzt nichts gefunden und verstehe auch nicht wieso es nicht geht.


----------



## tuxedo (16. Jul 2007)

Wo hängt denn der Datenbankrechner? Im Internet? Wenn ja: 
Die allermeisten Provider lassen verbindungen ausserhalb von "localhost" nicht zu.

Aber ich seh gerade: Du hast nen vServer? Hast du die Firewall kontrolliert? Kannst du "testweise" eine Telnet-Verbindung zum Port 3306 des MYSQL-Servers herstellen? Wenn ja, dann liegts an den Berechtigungen in der DB. Wenn nein: Firewall oder sonst ein COnfig-Problem. Hast du den MySQL-Server auch so eingestellt dass er außerhalb von localhost lauscht?

- Alex


----------



## Eisscholle (17. Jul 2007)

Hi,

der Rechner ist mein vServer. Ich habe root-Zugriff. Als Sever habe ich "localhost",Server-IP und 127.0.0.1 probiert. Immer der selbe Fehler.

Bei netstat -an steht:


> tcp        0      0 server-ip:3306       0.0.0.0:*               LISTEN



Der horcht also schon. Die Firewall habe ich jetzt nicht weiter kontrolliert, weil er ja nach außen normal horcht.

Gehe ich mit telnet auf den Port, sehe ich ganz cryptische Zeichen:


```
A
 5.0.41-Debian_1-logñ↨U~@bK2XD,☻+ImhBRU5GD`8
```
Tippe ich was.

```
Verbindung zu Host verloren.
```

Ich persönlich glaube fast, es liegt an der Datenbank. Weil der Fehler lautet ja


```
com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: Access denied for user 'benutzer1'@'vserver.server.de' to database 'benutzer1'
```

Würde es am Host liegen usw., dann dürfte doch eine Meldung wie im ersten Beitrag kommen. Der meint ja wirklich, dass ich nicht als benutzer1 auf die Datenbank benutzer1 komme.

Datenbank mysql, Tabelle user, Spalten Host und User

```
localhost  	             benutzer1  
vserver.server.de 	benutzer1 	
vserver 	            benutzer1 	
% 	                       benutzer1
```

Datenbamk mysql, Tabelle db, Spalten Host, Db, User


```
%  	benutzer1  	benutzer1  	
localhost 	benutzer1 	benutzer1
```

Ich verstehe nicht, wieso ich mit PHP wunderbar drauf komme und mit javas solche Probleme habe. Damit komme ich wieder zu dem Schluss, dass es eigentlich nicht an der DB liegen kann, sondern an Java. Hier nochmal mein Java-Code:


```
import java.io.*;
import java.sql.*;

public class Mysql
  {

  public static void main( String[] argv )
    {

    String treiber=null, DbUrl=null ;

    //*** "Name des Datenbanktreibers eingeben
    treiber = "org.gjt.mm.mysql.Driver" ;
    treiber = "com.mysql.jdbc.Driver";
    //*** "Url der Databank eingeben *********
    //*** Server : linux
    //*** Service-Nummer : 3306
    //*** Bezeichnung der Datenbank : benutzer1
    DbUrl = "jdbc:mysql://localhost:3306/benutzer1?user=benutzer1&password=password";

     try {

         //*** Treiber laden ***********************************
         Class.forName( treiber ).newInstance();
          //*** Verbindung aufnehmen:    ************************
          //*** Der User peter mit Kennwort mysql moecht was wissen
                 System.out.println("geht noch"); //hier geht es noch
         Connection cn = DriverManager.getConnection( DbUrl ); //hier steigt er dann aus
          System.out.println("geht nicht mehr"); //das kommt schon nicht mehr
```

Hat jmd. noch Ideen? Weil ich weiß nicht mehr weiter aber es muss ja gehen!


----------



## tuxedo (17. Jul 2007)

Okay, wenn das mit Telnet auf Port 3306 deines MySQL-V-Servers übers Internet funktioniert, dann lauscht dein MySQL auch öffentlich.

D.h. dein Problem liegt bei den Benutzerrechten. Das sagt ja auch: Access denied for user 'benutzer1'@'vserver.server.de'

PHP wirst du vermutlich lokal auf dem vServer laufen lassen. Ergo benutzt du hier localhost. Und das geht ja eigenbtlich immer.

Dass es an Java liegt bezeifle ich. Was mich aber noch wundert: 
Du hast in deinem Java-Code oben "localhost" drin stehen. Da sollte doch die IP oder der Hostname des vServers drin stehen?

Oder läuft die Anwendung lokal auf dem vServer?

Hier mal mein Beispiel mit dem ich das immer gemacht habe. Benutzername und Passwort stehen hier "extra" und nicht in der "url":


```
String driver	= "com.mysql.jdbc.Driver";
		
String serverURL = "jdbc:mysql://localhost:3306/meinDbName?zeroDateTimeBehavior=convertToNull";
			
String user 	= "meinUser";	
String password 	= "meinPasswort";

// Select fitting database driver and connect:
Connection con = null;
		
try {
  Class.forName(driver);
  con = DriverManager.getConnection(serverURL, user, password);
} catch (Exception e) {
  e.printStackTrace();
}
```

Aber das hattest du ja schon so, oder?

Du könntest auch mal probieren mittels einem MySQL-Client zu deinem Server zu connecten. NaviCat oder http://www.heidisql.com/ sind hier recht behilflich...

- Alex


----------



## Eisscholle (17. Jul 2007)

Hi,

der Client ist .super! Lokal passt alles. Im web habe ich mich nicht mit einer Datenbank verbunden, sondern nur mit meinem Benutzer auf meinem Server und habe mir anzeigen lassen, auf welche DBs ich zugreifen darf. Und er zeigt mir nur die Datenbank "information_schema". Die war schon da, ist irgendetwas zu Mysql/phpmyadmin. Dort kann ich machen was ich will. Aber ich komme nicht auf meine eigene Datenbank. Nun wissen wir zwar woran es liegt aber wieso?

VG


----------



## tuxedo (17. Jul 2007)

Es reicht nicht einen Benutzer anzulegen. Du musst ihm auch rechte für eine bestimmte DB geben. Das kannst du mit phpmyadmin aber recht gut einstellen.

- Alex


----------



## Eisscholle (17. Jul 2007)

Hi, jetzt geht es komplett. Fragt aber bitte nicht wieso. Ich habe nix weiter geändert. Irgendwie geht es auch mit einem Passwort, was gar nicht in der Tabelle steht aber ggf. wird da noch was aktualisiert. Danke aber erstmal. Ich hoffe es geht dann weiterhin. *g*


----------

