RSS Feed
28
Nov.
2006

Ein erster Eindruck von Db4o

Schon seit einiger Zeit wollte ich mir die objekt-orientierte Datenbank Db4o für Java ansehen, hat doch diese Datenbank vielerorts von sich reden gemacht. Angespornt durch die Ankündigung, dass die nächste anstehende Version 6.0 Verbesserungen bezüglich des Speicherverbrauchs und der Performance mitbringen soll, habe ich mir also nun endlich einmal Db4o näher angesehen.

Was ist nun der Unterschied zu einer traditionellen relationalen Datenbank, insbesondere in Verbindung mit Hibernate? Nun, der wesentliche Unterschied ist der, dass man sich keine Gedanken darüber machen muss, auf welche Art und Weise man sein Datenmodell in die Datenbank persistieren kann. Man schreibt also einfach sein Datenmodell, erzeugt eine Instanz und speichert diese in der Datenbank ab:

ObjectContainer db = ...
db.set(myObject);

Das war's. Db4o wandert automatisch alle Kind-Referenzen ab und speichert diese ebenfalls. Angenommen man hätte folgende zwei Klassen:

public class Parent {
    private String name;
    private List childs = new LinkedList();     
    public Parent(String name) { this.name = name }
    public void addChild(Child child) {
        childs.add(child);
    }
}

public class Child {
    private String name;
    ...
}

und man würde folgende Instanzen erzeugen:

Parent p = new Parent("parent");
p.addChild(new Child("child 1"));
p.addChild(new Child("child 2"));

so würde Db4o automatisch alle Childs mitabspeichern, wenn man Parent p mit db.set() speichern würde.

Doch wie schaut es mit der Abfrage aus? Db4o unterstützt verschiedene Anfrage-Sprachen (QBE, Native Queries, S.O.D.A), wobei SODA quasi die Low-Level API darstellt. Obwohl Db4o selber die Verwendung von Native Queries empfiehlt, sagt mir die Low-Level API SODA eher zu. Ein paar Beispiele:

Finde ein Parent-Objekt mit dem Namen "parent" :

query.constrain(Parent.class).descend("name").constrain("parent").equal();

Finde ein Parent-Objekt, dessen Child den Namen "child 1" hat:

query.constrain(Parent.class).descend("childs")
    .descend("name").constrain("child 1").equal();

Selbstverständlich sind auch komplexere Anfragen möglich. Sofern es meine Zeit zulässt, werde ich in den folgenden Tagen von meiner praktischen Erfahrung mit Db4o berichten. Der erste Eindruck ist auf jeden Fall schon mal ganz angenehm =)