# Wie mit Datenbank verbinden, z.B. DB2? VERZWEIFLUNG PUR!



## Java-Umsteiger (28. Jan 2009)

Hallo, ich bin Umsteiger von PHP und sitze hier an meinem Desktoprechner.
Auf einem anderen Rechner (Linux) läuft eine IBM DB2-Datenbank, zu der ich mich verbinden möchte. Ich nutze das Apache Jmeter und kann mich über das Jmeter Messungen vornehmen. Dazu muss ich über VPN mit dem fremden Netz verbunden sein und alles  läuft wie es soll.
Vorher muss ich für den jmeter ca. ein Dutzend Parameter in einer JDBC-Verbindungskonfiguration angeben. Das habe ich gemacht, und jmeter läuft prima. Also grundsätzlich ist die Verbindung von meinem Windowsrechner zu einer DB2-Datenbank auf einem Linux-System möglich.


Soooooo.....


Nun will ich mal ein eigenes Javaprogramm schreiben, um ein paar SQL-Befehle zu senden. Ich bin Umsteiger von 
PHP / Mysql und bin es gewohnt, einfach zu schreiben: 				

$db=@mysql_connect("host","user","passwort");
mysql_select_db(datenbank,$db);
echo mysql_error($db);

3 Zeilen! 3 einfache Zeilen und alles wird schon mit PHP mitgeliefert!

Wie verbinde ich mich nun unter JAVA mit einer DB2-Datenbank? Ich habe mal das Inseltutorial angelesen, aber werde daraus nicht so richtig schlau: da gibt es zig Treiber, die man evtl. vorher noch installieren muss!

Wo muss man die Treiber installieren?
Auf dem eigenen Rechner?
Auf dem Rechner, auf dem die Datenbank läuft? (Da sind sie wohl schon installiert. jmeter ist in Java und läuft prima)

Wenn man die Treiber dann installiert hat(?), wie geht es weiter?
Wie kriegt man zumindest mal einen Pieps von der Datenbank auf meine Java-Konsole ausgegeben?

Zur Info: Ich habe mir Eclipse runtergeladen, das ist auch neu für mich. Mein Rechner läuft mit Windows XP.


Danke für Antworten und Tipps!!


----------



## The_S (28. Jan 2009)

Es gibt nicht zig Treiber, sondern es gibt genau einen Treiber für jede DB. Diesen Treiber installierst du auch nicht, sondern machst ihn für deine Java-Klasse verfügbar indem du ihn in den Classpath einbindest.

Jenachdem was für eine Technologie du hast (Client verbindet sich direkt auf die DB oder Client kommuniziert mit Server, welcher auf die DB zugriff hat) muss dort, wo die Verbindung aufgebaut werden soll, der Treiber verfügbar gemacht werden.

Wenn du das hast, ist es genauso wie im Insel-Tutorial:

1.) Treiber über Class.forName laden
2.) Connection über den DriverManager aufbauen
3.) (Prepared)Statement von der Connection mit dem gewünschen SQL erstellen lassen
4.) Statement abschießen
5.) ggf mit einem ResultSet das Ergebnis abfragen.


----------



## Java-Umsteiger (28. Jan 2009)

So sieht es inzwischen bei mir aus:



```
import java.sql.*; 

public class db {

	public static void main(String[] args) {
		
		 try 
		    { 
				Class.forName( "com.ibm.db2.jcc.DB2DataSource" ); 
		    } 
		    catch ( ClassNotFoundException e ) 
		    { 
		      System.err.println( "Keine Treiber-Klasse!" ); 
		      return; 
		    } 
		    Connection con = null;
		    try
		    {
			con = DriverManager.getConnection( "jdbc:db2:HOSTNAMEDESRECHNERMITDERDATENBANK", "USER", "PASS" );		    
		    }
		    catch ( SQLException e ) 
		    { 
		      e.printStackTrace(); 
		    } 	    
	}
}
```

Aber das Ergebnis ist: Keine Treiber-Klasse. Die ClassNotFoundException wird geworfen.
Muss ich DOCH noch irgendeinen Spezialtrick um den Treiber ausführen?


----------



## The_S (28. Jan 2009)

Nein, das Jar des Treibers muss wie gesagt in den Classpath. Mehr nicht.

Klassennamen schreibt man btw. groß.


----------



## tfa (28. Jan 2009)

DB2DataSource ist im übrigen kein Treiber. Bei mir heißt die Klasse com.ibm.db2.jcc.DB2Driver.


----------



## Java-Umsteiger (28. Jan 2009)

Hobbit_Im_Blutrausch hat gesagt.:
			
		

> Nein, das Jar des Treibers muss wie gesagt in den Classpath. Mehr nicht.


Aha! Ich muss mir also noch irgendeine jar-Treiberdatei besorgen und irgendwohin kopieren..?
Im bin-Ordner von jmeter liegt ein ganzer Haufen jr-Dateien. Irgendeine von denen scheint dann ja die fehlende zu sein.

Was ist der classpath und wie krieg ich die Dateien da hinein?



			
				Hobbit_Im_Blutrausch hat gesagt.:
			
		

> Klassennamen schreibt man btw. groß.


----------



## The_S (28. Jan 2009)

http://www.java-blog-buch.de/0703-einbinden-von-externen-klassen-classpath/

Wenn du Eclipse verwendest, einfach in den Build-Path integrieren.


----------



## Java-Umsteiger (28. Jan 2009)

Ich habe einfach mal auf Verdacht das ganze jakarta-jmeter-Verzeichnis mit in den Buildpath integriert. Eclipse hat nen Weilchen rumgearbeitet (building workspace...)

Doch: Auch ein neuer Compilerlauf brachte jetzt nur das Ergebnis wie vorher: "Keine Treiber-Klasse!" Wie kann es sein, dass mein Programm nicht läuft, aber jmeter schon?

Den Treibernamen habe ich auch korrigiert: com.ibm.db2.jcc.DB2Driver
Allerdings ist unter den zahlreichen jar-Dateien im jmeter-Ordner keine, die com.ibm.db2.jcc.DB2Driver.jar heißt oder auch nur ähnlich.

Muss ich mir den Treiber noch irgendwo herunterladen?


----------



## tfa (28. Jan 2009)

Bei mir heißt die JAR-Datei "db2jcc.jar". Dazu gibt es noch eine Lizenz-JAR namens "db2jcc_license_cisuz.jar", die auch in den Klassenpfad gehört.


----------



## Java-Umsteiger (31. Jan 2009)

tfa hat gesagt.:
			
		

> Bei mir heißt die JAR-Datei "db2jcc.jar". Dazu gibt es noch eine Lizenz-JAR namens "db2jcc_license_cisuz.jar", die auch in den Klassenpfad gehört.



Weiß jemand, wo es den Treiber zum download gibt? Ich habe es hier probiert:
http://publib.boulder.ibm.com/infoc...sp?topic=/com.ibm.db2.udb.doc/ad/t0010264.htm

Aber wenn ich mir den Text da so durchlese, geht es um die Installation einer DB2-Datenbank auf meinem Rechner. Das will ich nicht! Die Datenbank läuft wie gesagt auf einem anderem Rechner und ich brauche wohl nur noch die "db2jcc.jar" und "db2jcc_license_cisuz.jar". Bei IBM habe ich mich mal registriert, falls das weiterhilft.

Es muss doch irgendwie möglich sein, sich einfach nur mit Java mit einer Datenbank zu verbinden?!? Ich stehe gerade wie der Ochse vorm Berg und kann nicht glauben, dass man erst hunderte von Megabytes runterladen und installieren muss nur für einen popeligen Treiber?!?


----------



## Java-Umsteiger (31. Jan 2009)

Sooooo.....  Jetzt habe ich mir mal den DB2-Client installiert, den man sich bei IBM downloaden kann, nachdem man sich registriert hat:
http://www-01.ibm.com/software/data/db2/9/download.html Ungefähr 300 MB!!!

Nach einer mittleren Konfigurationsorgie bin ich nun über diesen DB2-Client mit der entfernten Datenbank verbunden. In meinem Windows-System läuft zusätzlich der Prozess "db2mgmtsvc.exe" und unter C:\Programme\IBM\SQLLIB\java befinden sich so einige .jar-Dateien, u.a. auch die db2jcc.jar !!

Mann, war das ein Akt!! Endlich gehts weiter!!


----------



## Java-Umsteiger (1. Feb 2009)

Was ist denn jetzt wieder kaputt? Das Codebeispiel gibt jetzt aus:




> IBM DB2 JDBC Universal Driver Architecture(c) Copyright IBM Corporation 2003
> 
> Syntax:
> 
> ...



Ich habe die db2cc.jar erfolgreich in den Buildpath aufgenommen:



Links die lange aufgeklappte Liste... Beim ersten compilieren musste ich eine Datei aus dem .jar_archiv auswählen und habe einfach irgendeine ausgewählt. Da kam so ein Pop-Up von Eclipse oder von IBM oder von wem auch immer.

- Wie geht es jetzt weiter?
- Wie kann ich jetzt noch nachträglich herausfinden, welche Datei ich ausgewählt habe und ob das die richtige Wahl war?
- Hat jemand vielleicht ein einfaches funktionierendes Beispiel, das folgendes leistet: Verbinden zu einer Datenbank und Abfrage einer Tabelle?

Ich komme nicht weiter. Wieso muss das alles sooooo ein Riesenaufwand sein, nur um eine einfach SQL-Abfrage zu stellen..?
Hier nochmal der aktuelle Code:

```
import java.sql.*; 

public class DATA { 

   public static void main(String[] args) { 
        
       try 
          { 
            Class.forName( "com.ibm.db2.jcc.DB2Driver" ); 
          } 
          catch ( ClassNotFoundException e ) 
          { 
            System.err.println( "Keine Treiber-Klasse!" ); 
            return; 
          } 
          Connection con = null; 
          try 
          { 
         con = DriverManager.getConnection( "jdbc:db2:HOSTNAMEDESRECHNERMITDERDATENBANK", "USER", "PASS" );          
          } 
          catch ( SQLException e ) 
          { 
            e.printStackTrace(); 
          }        
   } 
}
```


----------



## tfa (1. Feb 2009)

Du musst schon dein Programm starten, also die Klasse DATA. Und nicht com.ibm.db2.jcc.DB2Jcc.
Klick die Klasse in Eclipse an, dann rechte Maustaste->Run As->Java Application


----------



## Java-Umsteiger (1. Feb 2009)

Ahja, das hat wohl geholfen! Jetzt ist die Ausgabe:



> com.ibm.db2.jcc.b.nm: [jcc][4038][12241][3.50.152] T2LUW-Ausnahmebedingung: SQL1013N  Der Aliasname der Datenbank oder der Datenbankname "HOSTNAME" wurde nicht gefunden.  SQLSTATE=42705
> ERRORCODE=-1013, SQLSTATE=42705
> at com.ibm.db2.jcc.b.wc.a(wc.java:579)
> at com.ibm.db2.jcc.b.wc.a(wc.java:57)
> ...



Das bedeutet ja scheinbar, dass schon mal der Versuch einer Verbindung unternommen wird und der Versuch aber scheitert. Weil "jdbc:db2:HOSTNAMEDESRECHNERMITDERDATENBANK", "USER", "PASS" natürlich nicht die richtigen Parameter sind. Da werde ich es dann mal mit den korrekten Daten probieren....

Sag mal: Du arbeitest wohl auch mit der IBM DB2? Wenn Du Deine DB2-Steuerzentrale einmal gestartet hast, kannst Du die dann auch nicht mehr beenden? Ist bei mir so. Win XP SP3 und JAVA 6 Aktualisierung 11. Auch ein seltsamer Effekt...


----------



## tfa (1. Feb 2009)

Java-Umsteiger hat gesagt.:
			
		

> Sag mal: Du arbeitest wohl auch mit der IBM DB2? Wenn Du Deine DB2-Steuerzentrale einmal gestartet hast, kannst Du die dann auch nicht mehr beenden? Ist bei mir so. Win XP SP3 und JAVA 6 Aktualisierung 11. Auch ein seltsamer Effekt...


Keine Ahnung, unsere DB2 läuft im Rechenzentrum auf OS/390. Ich verbinde mich nur über JDBC mit der Datenbank.


----------



## The_S (1. Feb 2009)

Also ich kann die ohne Probleme beenden


----------

