SQLite goes Java - JAXenter
Ein Blick auf SQLJet

SQLite goes Java

Rudolf Jansen

Eine der bekanntesten Datenbanken im Embedded-Bereich ist SQLite. Sie wird häufig in C-/C++-Projekten eingesetzt. Aber auch für Java-Entwickler steht seit Herbst diesen Jahres mit SQLJet eine API-Sammlung bereit, mit der auf diese weit verbreitete Datenbank zugegriffen werden kann.

Nicht immer muss die Datenablage einer Anwendung zwingend in einer separaten Datenbank erfolgen. Embedded-Datenbanken werden im Gegensatz zu den bekannten Serverdatenbanken (Oracle, IBM DB2, MySQL etc.) direkt in eine Anwendung integriert. Dies führt u. a. zu Performancevorteilen beim Zugriff auf die Daten, da der Netzwerkzugriff auf die ansonsten meist auf einem anderen Server liegende Datenbank entfällt. Im Java-Umfeld existieren eine Reihe solcher Datenbanken, die kompakt in Form einer JAR-Bibliothek in die Java-Anwendung integriert werden können, z. B. Apache Derby Oracle Berkeley DB oder HSQLDB . Zur Laufzeit steht die Datenbank dann in der selben Java Virtual Machine (JVM) zur Verfügung, in der auch der Rest der Anwendung läuft.

Aber nicht nur in der Java-Welt existieren solche Embedded-Datenbanken. In der C-/C++-Welt beispielsweise ist SQLite sehr bekannt und ist laut Anbieter die „meistgenutzte Datenbank der Welt“. Wer bei dieser These Zweifel hat, der sei auf die zugrunde liegende Rechnung verwiesen. Dort findet man auch einen Auszug von Systemen, die SQLite einsetzen, wie z. B. Mozilla Firefox, die Skype-Clientsoftware oder die McAfee-Antiviren-Software.

Ein wichtiges Einsatzgebiet von Embedded-Datenbanken im Allgemeinen und SQLite im Speziellen ist der Bereich der mobilen Endgeräte. Hier dürfte SQLite seine Spitzenposition in Zukunft noch weiter ausbauen, da es Bestandteil des Android-Entwicklungssystems ist. Was aber macht nun ein Java-Entwickler, der dieses Produkt aus der C++-Welt in seine Applikation einbauen will?

Seit Kurzem existiert für diese Aufgabe SQLJet . Dabei handelt es sich um eine Library, die ein API zur Verfügung stellt, mit dem aus Java-Anwendungen heraus auf SQLite-Datenbanken zugegriffen werden kann. SQLJet steht unter der GPL-Lizenz zur Verfügung. Wer bisher noch nie mit solchen „kleinen“ Datenbanken gearbeitet hat, der wird sich beim Umgang mit SQLJet umstellen müssen. Klassische SQL-Befehle wie INSERT INTO <table> oder SELECT * FROM <table> gibt es – mit Ausnahme einiger CREATE-Statements – nicht. Stattdessen wird über ein Low-Level-API in folgender Form auf die in Dateiformat vorliegende Datenbank zugegriffen:

File dbDatei = new File(DB_NAME);
SqlJetDb db = SqlJetDb.open(dbDatei, true);
db.beginTransaction(SqlJetTransactionMode.WRITE);
ISqlJetTable table = db.getTable(TABLE_NAME);
table.insert("<Spalte_1>", "<Spalte_2>",…);
db.commit();

Auch beim Thema Locking-Strategien sowie paralleles Schreiben und Lesen sind Besonderheiten zu beachten. Sobald eine Schreiboperation aktiv ist, wird die gesamte Datenbank gesperrt. Eine solche Einschränkung wäre im Client-Server-Bereich undenkbar bzw. ein K.O.-Kriterium gegen den Einsatz einer solchen Datenbank. Im Embedded-Bereich dagegen, in dem in der Regel nur eine Verbindung gleichzeitig aktiv ist, ist dies zwar in den meisten Fällen kein schwerwiegendes Hindernis. Trotzdem muss man diese Tatsache immer im Hinterkopf haben und sollte Transaktionen nie länger offen halten als unbedingt nötig. Eine weitere Besonderheit ist die Tatsache, dass offene Leseoperationen über Cursor den Abschluss von Schreiboperationen in einer anderen Tabelle verhindern. Immer vor Augen halten muss man sich also, dass die gesamte Datenbank zur Laufzeit aus einer einzigen Betriebssystemdatei besteht.

Alternativen

Wer nun als Java-Entwickler neugierig auf SQLite geworden ist oder umgekehrt als bisheriger C++-Benutzer in Zukunft auch über Java auf seine SQLite-Datenbanken zugreifen will, für den ist SQLJet aber nicht die einzige Alternative. Wer anstelle des in obigem Sourcecode-Beispiel zu erkennendem Low-Level-Zugriffs auf die Daten lieber mit den bekannten JDBC(Java DataBase Connectivity)-Methoden arbeiten will, der wird bei der Suche nach SQLite-JDBC-Treibern an zwei Stellen fündig: Der SQLite Java Wrapper /JDBC Driver von Christian Werner verwendet JNI (Java Native Interface), indem entsprechende Java-Wrapper-Funktionen über die Original SQLite-API-Funktionen gelegt werden. Die andere Alternative ist der SQLite JDBC-Treiber von David Crawshaw.

Unabhängig davon, ob man nun SQLJet oder einen klassischen JDBC-Treiber verwenden will, ermöglichen alle diese Alternativen einen Einsatz von SQLite auch in der Java-Welt und erweitern somit die Produktpalette im Bereich der Java-Embedded-Datenbanken um eine weitere Option, die bereits eine beeindruckende Liste von Referenzprojekten aufweisen kann.

Geschrieben von
Rudolf Jansen
Rudolf Jansen
Rudolf Jansen arbeitet als freiberuflicher Softwareentwickler und Journalist in Aachen. Seine Tätigkeitsschwerpunkte liegen in den Bereichen Java, C++, Android und Datenbanken.
Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.