Artikel

 
Oktober 2004 | Artikel

Fliegengewicht

(Link zum Artikel: http://www.it-republik.de/jaxenter/artikel/0312)

Open Source-Perlen: Die Sourceforge Datenbank HSQLDB

Text: von Stefan Edlich
  • Teilen
  • kommentieren
  • empfehlen
  • Bookmark and Share
HSQLDB ist eine kleine Java-Datenbank, die für Ihre Größe erstaunliches leistet. Neben der einfachen Installation und guter Performance bietet HSQLDB einige Datenbank-Features, die man eher von kommerziellen Datenbanken erwartet. Beispielsweise die Arbeit im Server Mode oder In-Memory Mode, der als performanter Datencache in Anwendungen eingesetzt werden kann.

Da HSQLDB [1] inzwischen einen hohen Bekanntheitsgrad erlangt hat und von zahlreichen Tools unterstützt wird, sind im Folgenden eher Entwickler angesprochen, die diese Datenbank noch nicht kennen oder Datenbank / SQL-Einsteiger sind.

Viele Entwickler starten üblicherweise mit MySQL und kommen dann evtl. im professionellen Umfeld mit db2 oder Oracle in Berührung. In dieser Datenbankliga kann und möchte HSQLDB zwar nicht spielen, sie kann aber für viele nicht zu komplexe Projekte eine Alternative sein.

Aufgrund der schnellen Installation und der kleinen JAR-Datei, kann man HSQLDB durchaus als Fliegengewicht-Pattern bezeichnen, dass aber viele der professionellen Anwendungsfälle abdecken kann und sogar Basis einiger großen Websites ist. Haupteinsatzgebiet ist z.B. die Verwendung zu Testzwecken oder die Entwicklungsphase eines Projektes, da hier sehr viel Zeit und Geld gespart werden kann.

Die erste Berührung
Die aktuelle Version 1.7.1 ist in Bezug auf das JAR mittlerweile auf 249KB angewachsen. HSQLDB praktisch zu nutzen, d.h. Datenbanken neu anzulegen, Daten einzutragen und zu verändern, kostet bei vorliegendem Sourcecode für SQL-Einsteiger (Listing 1) und fertigem Download der Datenbank etwa eine Minute. Es ist lediglich das Folgende zu tun:
  • Das hsqldb.jar in den Java-Pfad aufnehmen. Damit ist die Datenbank installiert (7 Clicks in eclipse = 45 Sekunden).
  • Es muss ein leeres Arbeitsverzeichnis für die DB vorliegen.
  • Den Code aus Listing 1 ausführen (15 Sekunden).
Listing 1: SQL-Quickstart mit HSQLDB
  1. import java.sql.*;
  2. import java.util.logging.*;
  3. public class UseHSQLDB {
  4. static Logger log = Logger.getLogger("de.myname.UseHSQLDB");
  5. public static void main(String[] args)
  6. throws SQLException, ClassNotFoundException { // Doit better ...
  7. log.log(Level.INFO, "Starting to load JDBCDriver... ");
  8. Class.forName("org.hsqldb.jdbcDriver");
  9. log.log(Level.INFO, "JDBC Driver successfully loaded!");
  10. Connection con =
  11. DriverManager.getConnection( // tmp must exist. Right slash.
  12. "jdbc:hsqldb:D:/tmp/musicShop","sa","");
  13. log.log(Level.INFO, "Connection established!");
  14. Statement stmt = con.createStatement();
  15. String sqlQuery =
  16. "CREATE TABLE cdShop (cdNr INTEGER, cdArtist CHAR(20),
  17. cdTitle CHAR(20));";
  18. ResultSet rs = stmt.executeQuery(sqlQuery);
  19. sqlQuery = "INSERT INTO cdShop VALUES (1,'Groeni','Mensch')";
  20. rs = stmt.executeQuery(sqlQuery);
  21. sqlQuery = "INSERT INTO cdShop VALUES (2,'Sting','Fields of Gold')";
  22. rs = stmt.executeQuery(sqlQuery);
  23. sqlQuery = "INSERT INTO cdShop VALUES (3,'Bach','Pluratorium')";
  24. rs = stmt.executeQuery(sqlQuery);
  25. sqlQuery = "UPDATE cdShop SET cdTitle='W-Oratorium' WHERE cdNr=1";
  26. rs = stmt.executeQuery(sqlQuery);
  27. sqlQuery = "SELECT * FROM cdShop";
  28. rs = stmt.executeQuery(sqlQuery);
  29. System.out.println("\n\n\nCD Shop DB\n=============\n");
  30. int counter = 0;
  31. while (rs.next()) {
  32. System.out.println(counter++ +".Datensatz:");
  33. int cdNr = rs.getInt("cdNr");
  34. System.out.println("\t[cdNr ->" + cdNr + "]");
  35. String cdArtist = rs.getString("cdArtist");
  36. System.out.println("\t[cdArtist ->" + cdArtist + "]");
  37. String cdTitle = rs.getString("cdTitle");
  38. System.out.println("\t[cdTitle ->" + cdTitle + "]\n");
  39. }
  40. con.close();
  41. }
Damit wurden Daten geschrieben, verändert und ausgelesen. Normale Installationsanleitungen beinhalten hier den unangenehmsten Punkt der kompletten Software-Installation der DB (wer mal die Datenbank des Marktführers komplett installiert und deinstalliert hat, kann von der dafür verbrauchten Zeit ein Lied singen) und der Einrichtung einer Tabelle. Letzteres ist auch oft bei professionellen Datenbanken nicht im Handumdrehen getan.

Wo ist nun aber die Einrichtung einer Tabelle geblieben? Nimmt man die Verbindung mit der Datenbank auf und existiert diese nicht, so wird diese automatisch (auch als Datei) angelegt und initialisiert. D.h. auf der Connection / dem Statement kann unmittelbar ein create ausgeführt werden, da getConnection() bei richtigem Pfad oder nicht vorhandener Datei quasi nie scheitert.
Arbeitsmodi
Die bisher vorgestellte Arbeitsweise entspricht dem In-Process Mode und hat zur Folge, dass Anwendung und Datenbank in einer virtual machine ablaufen. Dies ist in vielen Fällen in Ordnung, aber in anderen Fällen ist der Server Mode besser geeignet.

Doch zunächst zum In-Memory Mode. Aktiviert wird dieser Mode mit dem Punkt in der Anweisung jdbc:hsqldb:. in getConnection(). Bei dieser Arbeitsweise schreibt HSQLDB alle Daten in den Speicher, weshalb diese beim Beenden des Programms / der VM verloren gehen. Dennoch hat dieser Mode viele Vorteile:
  • Er ist schnell. Auf einem normalen Laptop führt HSQLDB in diesem Mode in einer Sekunde fast 4000 Updates (build statement / execute query) auf der Datenbank aus.
  • Dieser Mode ist auch für Applets gut geeignet, da keine unerlaubten Verbindungen (z.B. zum Filesystem) aufgenommen werden.
  • Applikationscaches werden oft mit Hashtable- oder Property-Objekten realisiert. Möchte man nun aber z.B. viele Strings zu einem Schlüssel speichern und auf diese so bequem wie per SQL zugreifen, so bietet sich dieser Mode an.

Der Server Mode lagert Client und Server auf verschiedene Rechner / VMs aus. Das Kommando
  1. java -cp ./hsqldb.jar org.hsqldb.Server -database musicShop
würde auf einem Rechner einen Server starten, der die Datenbank musicShop verwendet (genauso gut könnte auch hier mit . der In-Memory Mode aktiviert werden). Der Client würde mit
  1. jdbc:hsqldb:hsql://computername
per TCP/IP über ein eigenes Protokoll Kontakt aufnehmen. Muss über den http-Port kommuniziert werden oder die DB aus einem Servlet verwendet werden, bietet HSQLDB auch hier Lösungen an.
Realisierung, Tools und Features

Bei dem (automatischen) Erstellen einer Datenbank legt HSQLDB vier recht selbsterklärende Dateien an. Am interessantesten ist hier die Datei *.script. Diese Datei enthält die Tabellendefinitionen und verblüffenderweise auch die Daten in SQL-Form. Intelligente Algorithmen sorgen dafür, dass der Inhalt dieser Datei bei fortlaufenden Insert- und Delete-Anweisungen nicht ins Uferlose wächst, sondern erstaunlich klein bleibt.

HSQLDB wird mit einem einfachen Database-Manager (12K groß und Teil des JARs) ausgeliefert, der das interaktive Absetzen von SQL-Befehlen erleichtert und so manche große Tools überflüssig macht. Weitere Tools sind z.B. ein Transfer-Tool, welches Daten zwischen beliebigen Datenbanken transferiert und ein Skript-Tool, welches das Ausführen von großen SQL-Skripten erlaubt.
Natürlich kann HSQLDB auch (einfache) Transaktionen, Stored-Procedures, Joins, u.s.w. All diese Möglichkeiten können auf [1] nachgesehen werden.
Fazit
HSQLDB ist auch im Standalone-Modus trotz der menschenlesbaren Speicherung der Daten (in der Script-Datei) schnell und unterstützt fast alle SQL-92 Befehle. Die unglaublich einfache Installation und Bedienung hebt sie zusätzlich von anderen Datenbanken ab.

Es wird sicherlich eine Weile dauern, bis man in Projekten an die Grenzen von HSQLDB stößt (z.B. Transaktionen oder bestimmte Queries) und auf professionelle Datenbanken wechseln muss. Bis zu diesem Punkt kann allerdings viel Zeit gespart werden.
Links und Literatur


Anzeige

Kommentare

Gravatar dave 07.12.2007
um 13:42 Uhr
nett geschrieben, aber bei mir funktioniert das trotzdem auch nach stunden nicht.

Connection con =
DriverManager.getConnection( // tmp must exist. Right slash.
"jdbc:hsqldb:C: estcustomer","sa","");

connection established, aber ich wenn ich dann auf einen table zugreifen will, den es schon gibt, sagt er dass er nix gefunden hat
#zitieren

Anzeige

zurück zum Seitenanfang