20.5 Datenbanken und ihre Treiber
 
Vor dem Glück, eine Datenbank in Java ansprechen zu können, steht die Inbetriebnahme des Datenbanksystems. (Für dieses Kapitel ist das der schwierigste Teil.) Nun gibt es eine große Anzahl von Datenbanken – manche frei und Open Source, manche sehr teuer –, sodass die Auswahl einer Demo-Datenbank für das Buch immer wieder neu überlegt wird. Das Rennen macht in dieser Buchauflage die pure Java-Datenbank Derby, die sehr leicht auch ohne Administratorrechte zum Laufen gebracht wird, aber dennoch genügend leistungsfähig ist.
Für jede Datenbank werden Treiber benötigt. Ein Datenbanktreiber implementiert die Schnittstellen der JDBC-API. Sun veröffentlicht unter http://developers.sun.com/product/jdbc/drivers Treiber zu allen möglichen Datenbanken. Eine Suchmaske erlaubt die Eingabe einer Datenbank und die Auswahl eines gewünschten Typs.
20.5.1 Derby
 
Derby (http://db.apache.org/derby/) ist ein pures Java-RDBMS unter der freien Apache-Lizenz. Die Datenbank geht auf Cloudscape zurückgeht, was IBM Mitte 2004 auf der LinuxWorld in San Francisco der Apache Software Foundation übergeben hat. (1999 übernahm Informix Software Inc. die Datenbank Cloudscape von Cloudscape Inc., doch IBM übernahm die Datenbanktechnologien von Informix im Jahre 2001.) Ein großer Vorteil von Derby sind neben dem geringen Speicherbedarf die Transaktionsunterstützung, Trigger und SQL-Kompatibilität mit DB2.
Download und Vorbereitung
Auf der Download-Seite befinden sich drei Archive, wovon wir eine Datei mit der Endung -bin beziehen (etwa db-derby-10.1.1.0-bin.zip) und auspacken. Wir nehmen zu Testzwecken c:\Programme\derby an, sodass in C:\Programme\derby\frameworks\NetworkServer\bin die Skripte zum Starten und Stoppen des Servers zu finden sein sollten.
Derby lässt sich in zwei Modi fahren: als eingebettetes Datenbanksystem und als Netzwerkserver. Im Fall eines eingebauten Datenbanksystems ist lediglich die Klasse für den eingebetteten Treiber zu laden und die Datenbank zu bestimmen, schon geht’s los:
Class.forName( "org.apache.derby.jdbc.EmbeddedDriver" );
Connection con = DriverManager.getConnection( "jdbc:derby:OpenGeoDB;create=true" );
Wir wollen Derby als Netzwerkserver starten, um mit unterschiedlichen Clients – etwa einem Eclipse-Plugin – auf die Datenbank zugreifen zu können. In diesem Modus horcht Derby über TCP/IP an einem Port (standardmäßig 1527) auf eingehende Verbindungen.
Vor dem Start muss die Umgebungsvariable JAVA_HOME gesetzt sein, und DERBY_INSTALL auf das Installationsverzeichnis zeigen. Zunächst gehen wir in startNetworkServer.bat und setzen dort die nötigen Umgebungsvariablen:
Listing 20.1
startNetworkServer.bat
...
@REM -- This file for use on Windows systems
@REM ---------------------------------------------------------
@echo off
set JAVA_HOME=C:\Programme\Java\jdk1.5.0
set DERBY_INSTALL=C:\Programme\derby\
...
Ebenso setzen wir in startNetworkServer.bat die Umgebungsvariablen passend, da wir den Server auch wieder stoppen wollen.
Server-Start und weitere Tools
Nun lässt sich – etwa mit Doppelklick – das Skript startNetworkServer.bat starten, und die Datenbank quittiert freundlich:
Der Server ist bereit, am Port 1527 Verbindungen zu akzeptieren.
Das Programm sysinfo zeigt Versionsnummer und Klassenpfad an. Mit dem interaktiven Werkzeug ij lassen sich SQL-Anweisungen abschicken und so die ersten Versuche mit der Datenbank aufnehmen. dblook extrahiert das Datenbankschema.
JDBC-Treiber
Für einen JDBC-Zugriff ist ein JDBC-Treiber nötig, der bei Derby für eine Client-/Server-Kommunikation nicht dabei ist, denn Derby nutzt die Distributed Relational Database Architecture (DRDA), die auch DB2 verwendet. DRDA ist eine von der Open Group definierte Möglichkeit, von einem Client eine entfernte relationale Datenbank anzusteuern. Auf http://www-128.ibm.com/developerworks/db2/downloads/jcc/ ist die Datei db2jcc_for_derby.zip aufgeführt, die – nach einer Registrierung – auf der nächsten Seite unter »Released product: IBM Cloudscape (IBM DB2 JDBC Universal Driver, for Cloudscape/Derby)« heruntergeladen werden kann. Die beiden Jar-Dateien aus dem Archiv, db2jcc.jar und db2jcc_license_c.jar, sind in den Klassenpfad aufzunehmen. Für den Client-/Server- Modus von Derby benötigen wir keine weiteren Jar-Dateien, insbesondere keine aus dem lib-Verzeichnis von Derby.
20.5.2 MySQL
 
MySQL (http://www.mysql.de/) ist ein häufig eingesetzter freier und schneller Open-Source-Datenbank-Server. Er wird oft im Internet in Zusammenhang mit dynamischen Web-Seiten eingesetzt; das Zusammenspiel Linux, Apache, MySQL, PHP (LAMP-System) ist hoch gelobt. Herausragende Eigenschaften sind die Geschwindigkeit und die Bedienbarkeit.
JDBC-Treiber für MySQL: MySQL Connector/J
MySQL kann einfach über den unter der LGPL stehenden Typ-4-JDBC-Treiber MySQL Connector/J bedient werden. Der Treiber liegt unter http://dev.mysql.com/downloads/connector/j/ bereit. Nach dem Entpacken muss das Jar-Archiv des Treibers in den Klassenpfad aufgenommen werden. Er unterstützt die JDBC-3.0-API.
20.5.3 Microsoft Access
 
Mit Microsoft Access lässt sich mit wenigen Handgriffen eine Datenbank zusammenbauen, die dann anschließend über die JDBC-ODBC-Bridge aus Java zugänglich ist. Viele Anwender haben das Office-Paket von Microsoft zu Hause installiert und so schon eine Datenbank in der Nähe.
Eine einfache Datenbank ist schnell gebaut: Wird Access geöffnet, erscheint ein Dialog mit dem Eintrag Leere Access-Datenbank. (Alternativ lässt sich eine neue Datenbank unter dem Menüpunkt Datei, Neu ... einrichten.) Wir wählen den ersten Eintrag Datenbank und speichern die Datenbank unter einem aussagekräftigen Namen. Access benötigen wir nicht mehr direkt, weil die Kommunikation mit der Datenbank anschließend über den ODBC-Manager läuft. Dieser setzt dann auf dem SQL-Kern von Access auf. Im ODBC-Manager muss dafür die Datenquelle angemeldet werden. Dies beschreiben wir etwas später. Mit SQL können nun die Relationen eingetragen und darauf die Anfragen gestellt werden.
ODBC einrichten und Access damit verwenden
Eine ODBC- Datenquelle muss bei einer Zentrale angemeldet werden. Dazu gehen wir zunächst in die Systemeinstellungen (Start, Einstellungen, Systemsteuerung) und suchen ab Windows 2000 im Verzeichnis Verwaltung nach dem Symbol Datenquellen (ODBC). Nach dem Start öffnet sich ein Dialog mit dem Titel ODBC-Datenquellen-Administrator.
Wir gehen auf Hinzufügen, um eine neue Benutzer-Datenquelle hinzuzufügen. Im Dialog mit dem Titel Neue Datenquelle erstellen wählen wir den Microsoft Access-Treiber aus und gehen auf Fertigstellen. Ein Dialog öffnet sich, und wir tragen unter Datenquellenname einen Namen für die Datenquelle ein. Darunter können wir in Java später die Datenbank ansprechen. Der Name der Datei hat nichts mit dem Namen der Datenquelle gemeinsam. Optional können wir noch eine Beschreibung hinzufügen. Wichtig ist nun die Verbindung zur physikalischen Datenbank. Im umrandeten Bereich Datenbank aktivieren wir über die Schaltfläche Auswählen einen Datei-Selektor. Hier hangeln wir uns bis zur in Access erstellten Datei durch und tragen sie ein. Nun nur noch einige Male OK drücken, und wir sind fertig. Wenn der Administrator nicht meckert, können wir nun ein JDBC-Programm starten.
 Hier klicken, um das Bild zu Vergrößern
Abbildung 20.1
Auswählen einer Datenbank
Die Geschwindigkeit der JDBC-ODBC-Brücke
Die Geschwindigkeit des Zugriffs über die JDBC-ODBC-Brücke hängt von vielen Faktoren ab, sodass wir keine pauschale Antwort geben können. Denn zwischen der Abfrage unter JDBC bis zur Datenbank hängen viele Schichten, an denen unter anderem zahlreiche Hersteller beteiligt sind:
|
der JDBC-Treiber-Manager von JavaSoft; |
|
der Treiber der JDBC-ODBC-Bridge von JavaSoft und Intersolv; |
|
der ODBC-Treiber-Manager von Microsoft; |
|
der ODBC-Treiber zum Beispiel vom Datenbankhersteller; |
|
die Datenbank selbst. |
Jede der Schichten übersetzt nun die Anfragen an die Datenbank in möglicherweise völlig andere Anfragen. So muss zwischen JDBC und ODBC eine Übersetzung vorgenommen werden, dann muss das SQL-Kommando geparst werden und so weiter. Danach geht der Weg auch wieder zurück, von der Datenbank über die Treiber bis hin zum Java-Code. Dies dauert natürlich seine Zeit. Zusätzlich kommen zum Zeitaufwand und dem Speicher, den die Konvertierung benötigt, noch Inkompatibilitäten und Fehler hinzu. Somit hängt das Gelingen der JDBC-ODBC-Brücke von vielen Schichten ab und ist oft nicht so performant wie eine native Implementierung.
Die JDBC-ODBC-Brücke implementiert seit Version 1.4 den JDBC 2-Standard.
20.5.4 Ein Typ-4-Treiber für den Microsoft SQL Server 2000
 
Microsoft bietet unter http://www.microsoft.com/sql/downloads/2005/jdbc.mspx einen Typ4 JDBC-Treiber für seinen SQL Server 2000 und SQL Server 2005 an. Der Treiber stammt ursprünglich von der Firma Merant DataDirect. Der Treiber benötigt Java SE 1.4 und ist lauffähig auf den üblichen Betriebssystemen Windows, Linux, Solaris AIX und HP-UX. Er implementiert den zeitgemäßen JDBC 3.0 Standard und lässt sich für Java EE-Applikationen einsetzen.
20.5.5 Oracle10g
 
Einer der bekanntesten Datenbanken stammt von Oracle. Um die Verbreitung weiter zu erhöhen, ist die Firma dazu übergegangen, eine vollwertige Version zum Download oder als CD freizugeben. Wer den Download nicht scheut, der kann unter http://www.oracle.com/technology/software/products/database/oracle10g/index.html die Version für Windows, Mac OS X, Linux und weitere Unix-Systeme herunterladen.
20.5.6 Eclipse-Plugins zum Durchschauen von Datenbanken
 
Fast genauso viele Eclipse-Plugins zum Administrieren von Datenbanken gibt es wie Datenbanken selbst. Relativ beliebt ist das Open-Source-Plugin QuantumDB (http://quantum.sourceforge.net/) und das Eclipse WTP (http://www.eclipse.org/webtools/).
Eclipse WTP
Nach der Installation vom WTP (wie im Ende Kapitel 1 vorgestellt) öffnen wir den Dialog unter File | New | Other… | Data | SQL Scrapbook Page und geben einen Dateinamen (test) für eine Skriptdatei an.
 Hier klicken, um das Bild zu Vergrößern
Finish schließt den Dialog, legt eine Datei test.sqlpage an und öffnet diese in einem neuen Editor für SQL-Anweisungen. Zusätzlich aktiviert Eclipse eine neue View Database Explorer. In der View ist unter Connections das Kontextmenü zu bemühen und New Connection… auszuwählen. Im nachfolgenden Dialog ist links bei den Datenbank-Managern Derby 10.0 auszuwählen, als JDBC-driver wählen wir aus der Liste IBM DB2 Universal und als Database tragen wir »OpenGeoDB« ein. Die beiden Java-Archive db2jcc_license_c.jar und db2jcc.jar für den JDBC-Treiber sind unter Browse bei Class location auszuwählen und Benutzername/Passwort setzen wir »user« und »pass«. Mit einem Druck auf die Schaltfläche Test Connection bekommen wir die Information, ob alles gut geht, oder es Probleme mit den Parametern gibt.
 Hier klicken, um das Bild zu Vergrößern
Finish schließt den Dialog ab, und nach einer erfolgreichen Verbindung sind in der View die Datenbank sowie ihre Schemas zu sehen.
Grundlegende Schemata mit der Scrapbook-Seite aufbauen
In der Scrapbook-Seite wollen wir unsere Datenbank mit Leben füllen. Die Daten und Schemata für das Beispiel stammen von der Open-Source Datenbank OpenGeoDB (http://opengeodb.sourceforge.net/).
Listing 20.2
01_create_tables.sql
-- DROP TABLE geodb_typ;
-- DROP TABLE geodb_adm0;
-- DROP TABLE geodb_adm1;
-- DROP TABLE geodb_locations;
-- DROP TABLE geodb_population;
CREATE TABLE geodb_typ (
type integer not null primary key,
fld varchar(10) not null default '',
name varchar(250) not null default ''
);
INSERT INTO geodb_typ VALUES (1,'adm0','Staat');
INSERT INTO geodb_typ VALUES (2,'adm1','Bundesland / Kanton');
INSERT INTO geodb_typ VALUES (3,'adm2','Regierungsbezirk / Bezirk');
INSERT INTO geodb_typ VALUES (4,'adm3','Landkreis');
INSERT INTO geodb_typ VALUES (5,'adm4','Verwaltungszusammenschluss');
INSERT INTO geodb_typ VALUES (6,'ort','Stadt / Gemeinde');
INSERT INTO geodb_typ VALUES (7,'ortsteil','Orts- / Stadtteil');
INSERT INTO geodb_typ VALUES (8,'gemteil','unspezifizierter Gemeindeteil');
INSERT INTO geodb_typ VALUES (9,'wohnplatz','Wohnplatz');
CREATE TABLE geodb_adm0 (
adm0 char(2) NOT NULL default '',
name varchar(50) NOT NULL default '',
PRIMARY KEY (adm0)
);
INSERT INTO geodb_adm0 VALUES ('DE','Deutschland');
CREATE TABLE geodb_adm1 (
adm0 char(2) NOT NULL default '',
adm1 char(2) NOT NULL default '',
gs char(2) NOT NULL default '',
name varchar(50) NOT NULL default '',
PRIMARY KEY (adm0,adm1)
);
INSERT INTO geodb_adm1 VALUES('DE','BB','','Brandenburg');
INSERT INTO geodb_adm1 VALUES('DE','BE','','Berlin');
INSERT INTO geodb_adm1 VALUES('DE','BW','','Baden-Württemberg');
INSERT INTO geodb_adm1 VALUES('DE','BY','','Bayern');
INSERT INTO geodb_adm1 VALUES('DE','HB','','Bremen');
INSERT INTO geodb_adm1 VALUES('DE','HE','','Hessen');
INSERT INTO geodb_adm1 VALUES('DE','HH','','Hamburg');
INSERT INTO geodb_adm1 VALUES('DE','MV','','Mecklenburg-Vorpommern');
INSERT INTO geodb_adm1 VALUES('DE','NI','','Niedersachsen');
INSERT INTO geodb_adm1 VALUES('DE','NW','','Nordrhein-Westfalen');
INSERT INTO geodb_adm1 VALUES('DE','RP','','Rheinland-Pfalz');
INSERT INTO geodb_adm1 VALUES('DE','SH','','Schleswig-Holstein');
INSERT INTO geodb_adm1 VALUES('DE','SL','','Saarland');
INSERT INTO geodb_adm1 VALUES('DE','SN','','Sachsen');
INSERT INTO geodb_adm1 VALUES('DE','ST','','Sachsen-Anhalt');
INSERT INTO geodb_adm1 VALUES('DE','TH','','Thüringen');
CREATE TABLE geodb_locations (
id integer not null primary key,
typ integer default NULL,
name varchar(250) default NULL,
name_int varchar(250) default NULL,
gs varchar(8) default NULL,
adm0 char(2) default NULL,
adm1 char(2) default NULL,
adm2 varchar(250) default NULL,
adm3 varchar(250) default NULL,
adm4 varchar(250) default NULL,
ort varchar(250) default NULL,
ortsteil varchar(250) default NULL,
gemteil varchar(250) default NULL,
wohnplatz varchar(250) default NULL,
breite float default NULL,
laenge float default NULL,
kfz char(3) default NULL,
plz varchar(250) default NULL
);
CREATE TABLE geodb_population (
id integer not null primary key,
population_min integer default NULL,
population_max integer default NULL,
due_date date default NULL
);
Die rechte Maustaste, im Scrapbook-Editor gedrückt, offenbart im Kontextmenü ein das Skript anstoßendes Run SQL. (Im nachfolgenden Dialog wählen wir Use existing connection.) Das Skript legt nun die Tabellen an und fügt Zeilen ein. Wenn wir unsere Beispiele beendet haben, sollten wir im Database Explorer die Verbindung wieder schließen; dazu ist auf OpenGeoDb im Kontextmenü Disconnect zu wählen.
|