Eingebettete Datenbanken

Guybrush Threepwood

Top Contributor
Eingebettete Datenbanken - Embedded Database

Datenbanksysteme bieten zahreiche Vorteile, wenn es um die Organisation großer Datenmengen geht. Es existieren viele Systeme, die als Datenbankserver laufen. In diesem Fall kommuniziert der Client mit dem Server um Daten abzufragen oder zu speichern. Eine Reihe an Projekten ermöglicht es dagegen auch, eine Datenbank direkt in ein Programm einzubetten. In der Regel ist es hierfür lediglich notwendig, die entsprechende Bibliothek dem Klassenpfad hinzuzufügen.

Eine Auswahl an Datenbanksystemen für den Einsatz als Embedded Database (alle in Java geschrieben und unter Apache-, MPL-, LGPL- oder BSD-Lizenz oder einer vergleichbaren Lizenz einsetzbar; auch für kommerzielle closed-source Projekte geeignet):

H2 Database Engine
+ Schnelle Datenbank mit kleinem Footprint
+ Lässt sich auch im Servermodus, oder als In-Memory-DB betreiben
+ Sehr rege Weiterentwicklung
+ Datenbank-Dateien werden in einer einzelnen Datei abgelegt; hierdurch leichte Sicherung und Weitergabe möglich
+ Integrierte Volltextsuche
+ Verschlüsselungsmöglichkeiten
+ Backup-Tools​

HSQLDB
+ kleine und sehr schnelle Datenbank für kleine bis mittlere Datenbanken
+ etabliertes Projekt, das bereits seit über 10 Jahren entwickelt wird
+ Verschlüsselungsmöglichkeiten
+ Backup-Tools
+ kommerzieller Support verfügbar​

Apache Derby
+ bereits Teil des JDK
+ gehostet bei Apache -> große Community; Weiterentwicklung gewährleistet
- deutlich langsamerer Start als H2 oder HSQLDB​

Oracle Berkeley DB 11g
Keine persönliche Erfahrung / Keine Bewertung möglich

Mckoi SQL Database
Keine persönliche Erfahrung / Keine Bewertung möglich

Daffodil DB - One$DB
Keine persönliche Erfahrung / Keine Bewertung möglich

Für die meisten Anwendungszwecke ist sicher H2, HSQLDB oder Derby eine sehr gute Wahl. Neben den hier dargestellten Datenbanksystemen gibt es darüber hinaus weitere, wie z. B. SQLite, die nicht in Java geschrieben sind, aber trotzdem aus einer Java-Anwendung heraus verwendet werden können. Weitere Infos und Bewertungen siehe z. B.


Eingebettete Datenbank am Beispiel von H2

Zunächst muss die zugehörige Jar-Datei dem Classpath hinzugefügt werden (h2-x.x.x.jar). Diese kann unter H2 - Downloads geladen werden.

Das folgende Beispiel baut eine Verbindung zu einer eingebetteten H2-Datenbank auf, die im Benutzerverzeichnis abgelegt ist. Falls keine Datenbank vorhanden ist, wird diese beim ersten Verbindungsaufbau angelegt. Liegt am angegebenen Ort dagegen eine Datei mit dem Namen "myDatabase.h2.db", so wird diese automatisch eingebunden.

Die Datenbank ist AES-verschlüsselt. Bitte denken Sie daran, dass Passwörter und Benutzernamen nicht im Code gespeichert werden sollten.
Hier im Beispiel ist dies nur zur Verdeutlichung so gemacht. Der Code legt eine einfache Tabelle 'PERSON' an, sofern diese noch nicht existiert. Die Tabelle verfügt über die Felder ID, Vorname und Nachname, sowie ein Änderungsdatum (long, z. B. System.currentTimeMillis()). Das letzte Feld vom Typ OTHER dient in diesem Beispiel der Serialisierung eines Objekts. Kein Feld darf leer sein (= 'NOT NULL'). Informationen, über die in H2 verfügbaren Datentypen gibt es unter H2 - Data Types.

Java:
Connection con;

try {
  //Benutzerspezifische Einstellungen
  String userDir = System.getProperty("user.home");
  String databaseName = "myDatabase";
  String userName = "user";
  String userPswd = "userpswd";
  String filePswd = "filepswd";
  
  //Datenbanktreiber initialisieren
  Class.forName("org.h2.Driver").newInstance();
  
  //URL fuer Datenbank zusammenbauen und Verbindung oeffnen
  String databaseUrl = "jdbc:h2:" + userDir + File.separator
          + databaseName + ";CIPHER=AES";
  
  con = DriverManager.getConnection(databaseUrl, userName,
          filePswd + " " + userPswd);
  
  //Erstelle eine Tabelle 'PERSON', sofern noch keine existiert
  Statement personTable = con.createStatement();
  personTable.execute("
          CREATE TABLE IF NOT EXISTS PERSON(
          PERSONID IDENTITY PRIMARY KEY, 
          FORENAME VARCHAR(50) NOT NULL, 
          FAMILYNAME VARCHAR(50) NOT NULL, 
          MODIFICATION BIGINT NOT NULL, 
          MYOBJECT OTHER NOT NULL)
  ");
  personTable.close();
  
} 
catch (InstantiationException e1) {
  e1.printStackTrace();
} 
catch (IllegalAccessException e1) {
  e1.printStackTrace();
} 
catch (ClassNotFoundException e1) {
  e1.printStackTrace();
} 
catch (SQLException e1) {
  e1.printStackTrace();
}

Nach dem Durchlaufen des Programms wird unter user.home eine Datenbankdatei mit der Bezeichnung myDatabase.h2.db zu finden sein.
 
Zuletzt bearbeitet von einem Moderator:

Oben