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
import java.sql.*;import java.util.logging.*;public class UseHSQLDB {static Logger log = Logger.getLogger("de.myname.UseHSQLDB");public static void main(String[] args)throws SQLException, ClassNotFoundException { // Doit better ...log.log(Level.INFO, "Starting to load JDBCDriver... ");Class.forName("org.hsqldb.jdbcDriver");log.log(Level.INFO, "JDBC Driver successfully loaded!");Connection con =DriverManager.getConnection( // tmp must exist. Right slash."jdbc:hsqldb:D:/tmp/musicShop","sa","");log.log(Level.INFO, "Connection established!");Statement stmt = con.createStatement();String sqlQuery ="CREATE TABLE cdShop (cdNr INTEGER, cdArtist CHAR(20),cdTitle CHAR(20));";ResultSet rs = stmt.executeQuery(sqlQuery);sqlQuery = "INSERT INTO cdShop VALUES (1,'Groeni','Mensch')";rs = stmt.executeQuery(sqlQuery);sqlQuery = "INSERT INTO cdShop VALUES (2,'Sting','Fields of Gold')";rs = stmt.executeQuery(sqlQuery);sqlQuery = "INSERT INTO cdShop VALUES (3,'Bach','Pluratorium')";rs = stmt.executeQuery(sqlQuery);sqlQuery = "UPDATE cdShop SET cdTitle='W-Oratorium' WHERE cdNr=1";rs = stmt.executeQuery(sqlQuery);sqlQuery = "SELECT * FROM cdShop";rs = stmt.executeQuery(sqlQuery);System.out.println("\n\n\nCD Shop DB\n=============\n");int counter = 0;while (rs.next()) {System.out.println(counter++ +".Datensatz:");int cdNr = rs.getInt("cdNr");System.out.println("\t[cdNr ->" + cdNr + "]");String cdArtist = rs.getString("cdArtist");System.out.println("\t[cdArtist ->" + cdArtist + "]");String cdTitle = rs.getString("cdTitle");System.out.println("\t[cdTitle ->" + cdTitle + "]\n");}con.close();}
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
java -cp ./hsqldb.jar org.hsqldb.Server -database musicShop
jdbc:hsqldb:hsql://computername
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.




