Mittwoch, 23. Mai 2012


Artikel

August 2009 | Artikel

Datenbanken elegant in Embedded-Systeme integrieren

(Link zum Artikel: http://www.entwickler.de///002466)

Speicher für die Kleinen

Text: Dr. Christian Dietrich
  • Teilen
  • kommentieren
  • empfehlen
  • Bookmark and Share
Bei der Entwicklung von Anwendungen unter Embedded Linux wird C/C++ nach wie vor häufig eingesetzt. Stellt sich nur die Frage: Wie können die von der Anwendung benötigten Daten effizient gespeichert werden, ohne dass die Speicherlösung die letzten Ressourcen des Systems verschlingt? Wir betrachten einen Ansatz mit SQLite.
Teil 1   Teil 2   Teil 3   Teil 4   

Die SQLite-Datenbank ist eine mögliche Lösung des Problems. Dabei handelt es sich um eine kleine und leichtgewichtige Implementierung einer relationalen Datenbank. Zudem ist das Einbinden der Datenbank in das Embedded-System wesentlich einfacher als vielfach angenommen, da SQLite ohne aufwändige Konfiguration und ohne Datenbankserver auskommt. Wie mit den meisten anderen Datenbanken unterhält man sich auch mit SQLite über die Structured Query Language (SQL). Viele der gängigen Datenbanksysteme wie Oracle und MySQL sind umfangreich und daher viel zu komplex für den Einsatz in Embedded-Systemen. Häufig handelt es sich um Client-Server-Architekturen, die für kritische Anwendungen mit großen Datenmengen konzipiert wurden. Oftmals erfolgen die Zugriffe vieler Clients (Anwenderprogramme auf verteilten Rechnern) gewissermaßen gleichzeitig. Die Clients und der Server unterhalten sich dabei über Interprozesskommunikation, der Client sendet dem Server SQL-Befehle über das Netzwerk. Der Datenbankserver wiederum ist ein separater Prozess, der die SQL-Anfragen des Clients beantwortet und die Daten verwaltet. Doch in vielen Fällen gibt es nur einen Client, der sich auf demselben Rechner wie der Server befindet. In diesem Fall wäre es genial, wenn der Client – also das Anwenderprogramm – direkt auf die Datenbank zugreifen könnte!

Genau diesen Ansatz verfolgt die Minidatenbank SQLite, denn sie stellt ein relationales Datenbanksystem in Form einer Programmbibliothek ohne externe Abhängigkeiten bereit. Die Größe der Bibliothek in der aktuellen Version 3.6.4 beträgt für Linux/x86-Architektur lediglich 370 KB. Durch Einbinden dieser Bibliothek wird eine Anwendung um die gewünschte Datenbankfunktionalität erweitert. Die Datenbank wird dann direkt im Prozess der Anwendung ausgeführt. So entfällt die Netzwerkkommunikation zwischen dem Client und dem Server, was einen direkten Geschwindigkeitsgewinn mit sich bringt. Zudem ist die Anwendung auf keine externen Softwarepakete oder Serveranbindungen mehr angewiesen, da SQLite die komplette Datenbank bei Bedarf in einer oder mehreren Binärdateien abspeichert.

Was SQLite bietet

Die Minidatenbank wird public domain bereitgestellt und unterliegt daher keiner Lizenz. Sie ist dabei direkt für den Embedded-Einsatz konzipiert. Damit die Datenbank leichtgewichtig und gut wartbar bleibt, wurde allerdings auf einige Features verzichtet, die für Datenbanken im Mehrbenutzerbetrieb unerlässlich sind. So bietet SQLite beispielsweise keine Funktionen, um die referenzielle Integrität zu gewährleisten. Selbst die dafür notwendigen FOREIGN KEYS werden nicht unterstützt. SQLite bietet darüber hinaus keine integrierten Möglichkeiten, um Objektberechtigungen mehrerer Benutzer zu verwalten (SQL-Befehl GRANT und REVOKE). Dies sollte unter Embedded Linux keine allzu große Einschränkung darstellen, da hier die Rechteverwaltung auf Dateisystemebene zur Verfügung steht.

Im Einbenutzerbetrieb glänzt die Minidatenbank mit hilfreichen Features, denn bei SQLite werden Transaktionen ACID-konform ausgeführt. Der Begriff "ACID" steht für Automarität (atomicity), Konsistenz (consistency), Isoliertheit (isolation) und Dauerhaftigkeit (durability). Die Automarität bedeutet, dass eine Transaktion entweder ganz oder gar nicht ausgeführt wird. Sie wird durch ein nützliches Feature ergänzt: Eine Transaktion kann, während sie abgearbeitet wird, mit COMMIT bestätigt oder mit ROLLBACK rückgängig gemacht werden. Dadurch ist die Datenbank nach einer Transaktion immer in einem definierten, fehlerfreien Zustand. Unter Anderem unterstützt SQLite die oftmals hilfreichen Unterabfragen (subselects), Sichten (views) und Trigger für benutzerdefinierte Funktionen. Erstaunlich ist, dass die Minidatenbank fast den kompletten SQL-92-Standard (auch SQL2 bezeichnet) unterstützt, an dem sich viele der aktuellen Datenbanksysteme orientieren. Auf der Internetseite des SQLite-Projekts werden sowohl der komplette Sprachumfang als auch die Abweichungen zum SQL-92-Standard beschrieben.

In C/C++-Programmen kann die SQLite Library direkt verwendet werden, da die Bibliothek in C implementiert ist und eine C-Schnittstelle zur Verfügung stellt. Doch es gibt weitere Möglichkeiten, die SQLite-Datenbank in vielen anderen Programmiersprachen zu verwenden. So gibt es beispielsweise zahlreiche Skriptsprachen-Interfaces für die Programmiersprachen Perl, Python, Ruby, PHP und Tcl/Tk. Des Weiteren stehen ODBC- und JDBC-Treiber zur Verfügung.

Teil 1   Teil 2   Teil 3   Teil 4   

Kommentare