# Connection Problem für eine externe DB mit Java (JDBC)



## rohamis (3. Feb 2010)

hallo zusammen..
dies ist mein erster eintrag und ich möchte euch erstmal alle grüssen :toll:

also ich habe folgendes problem, und egal wie lange ich in google gescuth habe, oder hier in diesem forum, oder egal wo sonst, ich habe einfach eine lösung für mein problem nicht finden können:

es geht um eine java applikation, mit der ich auf eine EXTERNE datenbank zugreifen möchte..
und ich meine externe!!! überall bis jetzt (in tutorials, in anderen foren etc) habe ich das hier gesehen:
"localhost"..

nein ich möchte mich nicht mit eine DB verbinden die auf meinem rechner liegt.. NEIN!!!

also hier die beschreibung:

ich muss für jemandem eine java applikation schreiben, die auf seinem windows rechner einfach gestartet werden kann, sodass er dann mittels dieser applikation seine datenbank modifizieren kann, ohne also dass er sich per ssh auf dem server einloggt und dann in mysql rein geht um da lange befehle einzutippen..
soll also ein ganz einfach JOptionPane sein oder so.. mit eingabe felder und knöpfen..

also:

auf dem server "http://dieIPdesServers"
(System: Linux mainName.server4you.de 2.6.18-128.1.16.el5 #1 SMP Tue Jun 30 06:10:28 EDT 2009 i686)
ist MYSQL installiert, und zwar die version: 5.0.45

mit:

```
mysql> select user();
```
kommt:
"admin@localhost"
raus..

wenn ich mich in seine datenbank anmelden möchte, tippe ich:

```
mysql -h localhost -u admin -p xxxxx
```
ein, und ich muss dann das passwort yyyyyy eintippen

sein rechner ist WindowsXP Proffesional

er hat jdk installert und zwar: 1.6.0_18

ich habe jetzt das connector/j runtergeladen und alles richtig gemacht, die treiber werden auch richtig geladen mit:

```
Class.forName("com.mysql.jdbc.Driver").newInstance();
```

wenn ich dann mit:

```
con = DriverManager.getConnection("jdbc:mysql://dieIPdesServers/dbName","user","passwd");
```
in das java programm die verbindung aufbauen möchte bekomme ich das hier:


```
Communications link failure

The last packet sent succesfull to the server was 0 milliseconds ago. The driver has not received any packets from the server.
```

und zwar egal was ich mache, obich nun auch den port mitgebe (bei standard von mysql ist das eh 3306) oder ob ich von internet andere syntax-weisen geschrieben habe..

es kommt immer das..

ich habe es so ausführlich erklärt weil ich komme nicht mehr so klar damit:
1) welcher user-name ist den nun der richtige für diese datenbank? admin oder nicht?
2) welches ist denn das richtige passwort? das xxxxx oder das yyyyy?

sind vielleicht die versionen von mysql bzw. vom system des servers bzw. des connectors nicht miteinander kompatibel??

ich bin am verzweifeln und weiss nicht mehr weiter!!

vielen dank


----------



## Atze (3. Feb 2010)

also bei dem kollegen direkt am rechner kannst du dich einloggen mit dem benutzer "admin" und dem entsprechenden passwort?
kann es sein, dass die db keine remote zugriffe gestattet?


----------



## rohamis (3. Feb 2010)

ich danke dir für deine antwort aber ne ne, ich kann mich auch mit meinem rechner von meiner wohnung aus einloggen, mit putty, sowohl auf dem server also auch danach in der datenbank...
daran hatte ich auch gedacht aber das kann es ja nicht sein..

wenn ich mimttlerweile nur:

```
con = DriverManager.getConnection("jdbc:mysql://dieIPdesServers");
```
schreibe, (weil ich dachte mir ok lass mal kurz user und passwd weg, um überhaupt zu sehen ob der sich verbindet) kommt immer noch die selbe fehlermeldung raus.

 was tun?


----------



## Java.getSkill() (3. Feb 2010)

poste mal den ganzen code 

how to connect remote MYSQL using java
JAVA free example : How to connect to a MySQL database using JDBC? | consultant developer
How to Connect MySQL from JSP Page - JSP


----------



## rohamis (3. Feb 2010)

hier mein code:
(sagen wir mal die IP des Servers wäre: 62.123.45.65)


```
import java.sql.*;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class Example4
{
	public static String driverDB = "jdbc:mysql://";
	public static String  host = "62.123.45.65";
	public static String port = "3306";
	public static String dbName = "testdb";
	public static String user = "myName";
	public static String passwd = "myPasswd";
	public static String url;

	public static void main(String args[])
	{
		Connection con = null;
		System.out.println("Starting connect progress");

		try
		{
			//Class.forName("org.gjt.mm.mysql.Driver");
			Class.forName("com.mysql.jdbc.Driver").newInstance();
			//if(!con.isClosed())
			//System.out.println("Successfully connected to MySQL server using TCP/IP...");
		}
		catch(Exception e)
		{
			System.err.println("Exception: " + e.getMessage());
		}
		try
		{
			url = driverDB + host + ":" + port + "/" + dbName;
			System.out.println("Connecting with URL: " + url);
			con = DriverManager.getConnection(url,user,passwd);
		}
		catch(Exception e)
		{
			System.out.println("Connect-Exception: " + e.getMessage());
		}
		finally
		{
			try
			{
				if(con != null)
				con.close();
			}
			catch(SQLException e) {}
		}
	}
}
```

ich guck mir mal auch deine links an..
so langsam glaube ich irgendwie weist der server (oder was auch immer vom server) die verbindung zurück..
diese fehler meldung kommt nämlich nach ca. 30 sekunden laden, sobald ich das programm laufen lasse..
ich habe mich auf meinem (Windows XP) rechner mit:

```
telnet 62.123.45.65
```
oder mit:

```
telnet 62.123.45.65 3306
```
nicht verbinden können..
firewall settings oder ähnliches nicht ok?


----------



## Java.getSkill() (3. Feb 2010)

```
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class Verbindung{
	
	public static Connection getConnection(){
		
		try {
			   	Class.forName("com.ibm.db2.jcc.DB2Driver");
				return DriverManager.getConnection(
				       "jdbc:db2://arrrrrPirate:50000/Ninja", "Ninjauser", "pw");
			
			  } catch (Exception e) {
						   return null;
				  }
	}
	public static void main(String[] args) {
		Connection conn = null;
		Statement stmt;
		ResultSet rs;
		
		try {

			conn = getConnection();
			stmt = conn.createStatement();
			rs = stmt.executeQuery("SELECT * from xy");
			
			while (rs.next()) {
				System.out.println(rs.getString("ninja")+ "   "+ rs.getString("NAME"));
			}
			rs.close();
			stmt.close();
			conn.commit();
			conn.close();
		
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("Error to Database");	
		}
	}
}
```

62.123.45.65  da 
D:\Documents and Settings\test>ping 62.123.45.65

Pinging 62.123.45.65 with 32 bytes of data:

Reply from 213.234.128.252: TTL expired in transit.
Request timed out.
Reply from 213.234.128.252: TTL expired in transit.
Reply from 213.234.128.252: TTL expired in transit.

Ping statistics for 62.123.45.65:
    Packets: Sent = 4, Received = 3, Lost = 1 (25% loss),
Approximate round trip times in milli-seconds:
    Minimum = 0ms, Maximum = 0ms, Average = 0ms


----------



## rohamis (3. Feb 2010)

ehmm... ok.. 
habe leider deinen beitrag jetzt nicht so verstanden..
ausserdem sind es andere treiber in dem code den du gepostet hast..
und ich weiss nicht ob du irgendwie diese IP die ich gegeben habe gepingt hast (ich dachte ping ist nur für das lokale netzwerk oder wie jetzt??) aber diese IP ist von mir ausgedacht um meinem code zu posten..

sorry aber ich habs nicht so verstanden was du mir damit sagen möchtest :bahnhof:


----------



## Gast2 (3. Feb 2010)

Wenn 
	
	
	
	





```
telnet ipdeinesdatabasehosts 3306
```
 nicht geht hast du ein Firewall Problem, bzw die Datenbank ist configuriert keine Requests von aussen anzunehmen, oder der port ist nicht der richtige. Mann kann eine MySQL auch auf einem anderen port starten.

Das du über ssh auf den host kommst und von da auf die DB kommst lässt das stark vermuten.

Lies dich mal hier durch:
How Do I Enable Remote Access To MySQL Database Server?

Dann sllte dein Code eigentlich auch funktionieren.


"ping" ist wie telnet ein programm um mit anderen Rechner zu kommunizieren - nur das einzige was "ping" macht ist eine spezielles Netzwerkpaket ("ping" - Bist du da?) an den Remotehost zu schicken der dann mit "pong" (Jo, ich bin da") antwortet.

Das hat nichts mit lokalem Netzwerk zu tun. Das geht bei jedem Rechner der per Netzwerk erreichbar ist und die ICMP Requests vom "ping" aktzeptiert.


----------



## ARadauer (4. Feb 2010)

Wenn ich mich nicht auf meine DB die auf einem externen Server liegen verbinden kann, versuch ich zuerst mal mit sqlyog.
Klappt das auch nicht, liegt es wahrscheinlich nicht an meinem Code ;-)


----------



## rohamis (6. Feb 2010)

also ich danke euch für eure antworten..

erstmal möchte ich sagen dass an dem code alles ok ist..
zweitens: ich habe nun XAMPP installliert, und lokal eine kleine datenbank erstellt..
somit wenn ich nun auf "localhost" zugreife läuft das ganze voll gut..
ich verbinde mich und kann auch querys senden etc etc..

ich habe mittlerweile festgestellt dass es für die datenbank auf dem externen server an der firewall liegt, also besser gesagt, an den regenl die gesetzt sind..

port 3306 ist nicht erreichbar von aussen..
mit netstat -a steht "DROP" und nicht "LISTEN" oder so für den port..

mit iptables -L sehe ich keine regel dass verbinden zugelassen werden für diesen port bzw. dienst..

und obwohl in der my.cnf skip-networking kommentiert ist, und bind-address auf 0.0.0.0 steht (das sind die einstellugnen damit angäblich mysql von aussen erreichbar ist) bekomme ich trotzdem keine verbindung..

der server selbst ist erreichbar, ist ja auch klar, ich kann ja mit putty da rein, bzw. mit:
telnet serverIP 22 bekomme ich verbinung..
oder sogar mit telnet serverIP 25 gehe ich im mail port rein..

also ist alles ok..

nochmals danke an alle..


----------

