
Tags:
HSQLDB,
JAVA,
programmierenDatenbank Management System (kurz DBMS) gibt’s wie Sand am Meer. Schlachtschiffe wie MSSQL oder Oracle – *sigh* – bieten mehr oder minder Komfort in der Verwaltung des DBMS. Der geneigte 08/15-User verläuft sich sicherlich häufiger bei MySQL – was ja nun mittlerweile auch unter Oracle HerrschaftFührung entwickelt wird. Warum also HyperSQL (aka HSQLDB)? Gute Frage!
Auf der Arbeit nutze ich MSSQL. Das liegt darin begründet, das grob überschlagen vermutlich rund 80% aller Kundeninstallationen MSSQL-Datenbanken sind. Hat aber den entscheidenden Nachteil, das so eine dicke MSSQL ein wenig Ressourcen zieht. Wer mal auf einem normalen – *sigh* – Desktop-Rechner mit eclipse und einer parallel laufenden MSSQL-DB entwickelt hat, der wird schnell feststellen, das Hardware-Ressourcen in Form von Arbeitsspeicher schnell Mangelware sind. Insbesondere wenn man mit Datenbanken arbeitet, deren reiner Datenbestand auch mal niedliche 1GB umfassen.
Gutgläubig, wie man so ist, greift man jeden Tipp auf. OK – heute auf der Schaffe eben schnell HSQLDB geladen und installiert. Ja klar: Herunterladen, in einen Ordner seiner Wahl entpacken und – unter Windows – das beigefügte Startscript runServer.bat aufrufen. Das war’s! In etwa 200 Millisekunden steht einem ein DBMS zur Verfügung. Klasse Sache. Für den geneigten Linux- oder MacOS-Nutzer:
#!/bin/bash
cd ../data
java -classpath ../lib/hsqldb.jar org.hsqldb.server.Server
Zu speichern als runServer.sh mit chmod 755 runServer.sh im bin/-Verzeichnis der HSQLB-Installation.
OK – was mach ich nun damit? HSQLB legt unter data/ eine Test-Datenbank an. Ist jetzt nicht unbedingt der Einstieg schlechthin. Wer die üblichen DBMS gewöhnt ist, der erwartet vielleicht die Vorgehensweise: Mit dem Management-Tool seiner Wahl sich zur HSQLDB verbinden und mit CREATE DATABASE moep eine eigene, leere Datenbank anlegen. Mitnichten!
Nehmen wir als Management-Tool mal SQuirreL, dann ist für die Verbindung natürlich der JDBC-Treiber für HSQLDB notwendig. Der Treiber findet sich in der etwa 1 MB großen hsqldb.jar aus der HSQLDB-Installation. Was ja die eigentliche Datenbank ist. Ist der JDBC-Treiber von SQuirreL gefunden und geladen kann man aus den Varianten “In-Memory“, “Server“, “Standalone” und “Web-Server” wählen. “Server” ist nun erstmal eine gute Wahl. Mit der URL
jdbc:hsqldb:hsql://localhost
bekommt man auch eine Verbindung zu der laufenden DBMS-Instanz. Wer damit schon zufrieden ist, kann auf dieser Datenbank seine Tabellen erzeugen und damit arbeiten. Das ich damit nicht glücklich bin steht außer Frage.
Wer einigermaßen schlau ist, der wühlt sich durch diedas API und durch die Dokumentation. Dann wird ins Auge springen, das man HSQLDB parametrierbar(?) starten kann. Man übergibt dem obigen Start-Script einfach Parameter zur Datenbank, die man nutzen möchte:
--database.0 file:baseDb --dbname.0 baseDb
So hat man nun zumindest immer eine Datenbank im Zugriff. Kann reichen, muss aber nicht. Auch da hilft die Dokumentation weiter:
When a server instance is started, or when a connection is made to an in-process database, a new, empty database is created if no database exists at the given path.
Ich geh hier bewußt auf den file-Modus der Datenbank ein. Dieser erscheint mir persönlich am sinnvollsten. Gut, wie bekomm ich nun den in-process Zugriff? HSQLB ist in Java geschrieben und bietet eine entsprechend einfache Integration in Java-Projekte. Ja, wir sind nun schon auf einer Ebene, wo wir unsere Entwicklungs-Umgebung bemühen sollten. Denn nun heißt es, z.B. Java-Code auszuführen:
Connection c = DriverManager.getConnection(
"jdbc:hsqldb:file:/opt/db/testdb;ifexists=true", "SA", "");
OK, zerlegen wir zunächst obigen Code – vielmehr des Strings, der die Datenbank-Verbindung erzeugt (getConnection()):
- Parameter 1:
die Verbindungs-URL, typisch für den file-Mode. Die Datenablage im Dateisystem wird mit file: definiert, es folgt der Pfad zum Verzeichnis im Dateisystem, unter dem die Datenbank erzeugt werden soll. Der Datenbank-Name ist dabei der letzte Teil hinter dem (Back-)Slash. Dieser Teil erzeugt auch kein weiteres Verzeichnis, sondern lediglich Dateien mit dem Datenbank-Namen als Prefix.
Nun wird’s etwas knifflig: Oben wird hinter der URL noch ein Parameter angehangen, semikolon-separiert. ifexists=true bedeutet, das eine existierende Datenbank im Dateisystem genommen wird, sonst wird eine Neue erzeugt. Dazu gleich noch eine Anmerkung.
- Parameter 2:
Benutzername der Datenbank. Standardmäßig erfolgt der Zugriff über den HSQLDB-Benutzer “SA“. Lediglich bei diesem ist Groß-/Kleinschreibung irrelevant.
- Parameter 3:
Passwort des Benutzers. Auffallend ist: “SA” hat per default kein Passwort.
Bezüglich des Parameters ifexists=true hilft lesen ungemein:
For troubleshooting purposes, you can specify a connection property ifexists=true to allow connection to an existing database only and avoid creating a new database. In this case, if the database does not exist, the getConnection() method will throw an exception.
Hinweis: ifexists=true sucht auch explizit nach einer bestehenden Datenbank. Wird diese nicht gefunden, bekommt man direkt mal Exceptions um die Ohren gepfeffert.
Nun gut, dann haben wir also in Schritt 1 ohne ifexists=true die Datenbank erzeugt und greifen im Folgenden mit selbigem Parameter auf die erzeugte Datenbank zu. Komm ich nun auch per SQuirreL an die Datenbank ran? Logisch – wenn da keine offene Verbindung drauf existiert schon. Wie man – öhm – mehrere Verbindung, wenn denn möglich, nutzt lernen wir ich dann später mal. Was trägt man nun bei SQuirreL als URL ein?
Halt genau die obige URL – es geht wohlweißlich auch ohne den Parameter.
Wer meint, das seine Anwendung lieber mit einem Benutzer mit Passwort auf HSQLDB zugreifen sollte, der kann der erzeugten Datenbank per SQL mit dem Befehl
CREATE USER moep PASSWORD moep [ADMIN]
einen weiteren Nutzer hinzufügen – inklusive der optionalen Berechtigungen eines Admins. Dieser verfügt dann über die Berechtigungsrolle des “SA“-Benutzers. In die Tiefen der Benutzerrechte bin ich bisher noch nicht hinab gestiegen. HSQLDB ist auch primär eine Entwicklungs-Datenbank zum schnellen starten und stoppen und nicht für den produktiven Einsatz vorgesehn.
Wenn ich nun obiges SQL-Statement in SQuirreL abfeuer, dann greift indes eine merkwürdige Form des Case-Sensitive in HSQLDB: Egal ob groß oder klein geschrieben, ein erfolgreicher Verbindungsaufbau erfolgt nur, wenn Benutzername und Passwort groß geschrieben ist. Weiß der Geier warum …
Was macht man nun mit diesem gewonnen Wissen? Man kann zumindest mit seiner Java-Anwendung diese Datenbank nutzen. Hooray! Kein “ernsthafter” Entwickler geht noch ohne Hibernate – einem Persistenz-Framework für Datenbank-Verbindungen unter Java – an Datenbanken ran.
An dieser Stelle vertröste ich dann auf den zweiten Teil dieser Einführung in HSQLDB, die ich von der Arbeit aus wohl schreiben werde. Merkwürdigerweise fehlen mir Java-Projekte hier zu Hause, da hier das Entwickeln auf Grund von anderem, unnötigen Zeitvertreib seit Jahren zu kurz gekommen ist. Grob überschlagen bietet Hibernate einige Optionen für die Datenbank-Verbindung zu HSQLDB, die ich dann beim Aufbau meines Testsystems auch ausprobieren und womöglich nutzen werde.
So einfach HyperSQL auch ist, so – für mich – ungewöhnlich ist da die Vorgehensweise, wenn man es anders gewohnt ist. Gewonnen wäre zwar indes nur etwas für mich, wenn ich eine MSSQL-Datenbank in HSQLDB konvertieren könnte, aber ich muss eh mindestens eine neue, saubere Testumgebung für mich aufbauen. Von daher hoffe ich in Zukunft auf weniger Performance-Probleme beim Entwicklen – kann ja auch nicht schaden und reduziert wohlweislich den Koffein-Konsum.