www.wikidata.de-de.nina.az
db4o database for objects ist eine Objektdatenbank fur die Java Plattform und das Net Framework deren Weiterentwicklung im Jahr 2011 eingestellt wurde Der Quellcode ist noch auf Github verfugbar 1 Sie gehort zu den NoSQL Datenbanken Die db4o Programmbibliothek zeichnet sich durch einen vergleichsweise geringen Speicherbedarf von etwa 600 kB aus Dadurch eignet sie sich besonders fur die Einbettung in andere Programme und fur Umgebungen mit beschrankten Speicher Ressourcen wie beispielsweise PDAs Db4o konnte entweder unter den Bedingungen der GPL oder mit kommerziellen Lizenzen verwendet werden Db4oBasisdatenEntwickler Versant CorporationAktuelle Version 8 0 1 Februar 2011 Betriebssystem Unix Derivate Linux WindowsProgrammiersprache C JavaKategorie Datenbanksystem ServerLizenz Duales Lizenzsystem Proprietar und GPL deutschsprachig neinwww db4o com im Web Archivdb4o unterstutzte Javas JDK 1 1 x bis 6 0 und lief nativ auf Jakarta EE J2SE und allen J2ME Konfigurationen deren J2ME Profil die Reflection API bereitstellt Daneben unterstutzte db4o alle Sprachen die auf der virtuellen Maschine CLR der NET Plattform aufsetzen wie beispielsweise C oder VB NET Der fur die NET Plattform notwendige C Quellcode der db4o Programmbibliothek wurde dabei grosstenteils aus dem Java Quellcode generiert und ist auch auf der Mono Implementierung der NET Plattform lauffahig Inhaltsverzeichnis 1 Historie 2 Lizenz 3 Systemeigenschaften und Objektmanagement 4 Grundlegende API 5 Abfragesprachen 5 1 Query By Example QBE 5 2 SODA Criteria Queries 5 3 Native Abfragen 5 3 1 Vorteile 5 3 2 Nachteile 5 3 3 Beispiele 6 Transaktionen 7 Client Server Modes 8 Replikation 9 Ladeverhalten 10 Callbacks 10 1 Interne Callbacks 10 2 Externe Callbacks 11 Literatur 12 Weblinks 13 EinzelnachweiseHistorie BearbeitenDas db4o Projekt begann im Jahr 2000 unter Fuhrung von Carl Rosenberger Entwickelt wurde db4o von der Firma db4objects Inc die 2004 mit Hilfe von Investoren wie Mark Leslie VERITAS Software Vinod Khosla Sun Microsystems und Jerry Fiddler Wind River gegrundet wurde Im Dezember 2008 wurde die Datenbanksparte an Versant verkauft 2 DB4O wird derzeit nicht mehr weiterentwickelt Die Webseite www db4o com ist nicht mehr erreichbar und die letzte Anderung bei Sourceforge war 2015 weiterhin gehort Versant seit Dezember 2012 zu Actian 3 Lizenz Bearbeitendb4o wurde seit 2004 wahlweise unter der GPL als freie Software lizenziert oder unter einer kommerziellen Lizenz die die Verwendung in nicht GPL Projekten erlaubt Daneben gab es eine Classpath ahnliche Lizenz die es erlaubt db4o in Open Source Projekte zu integrieren die nicht db4o GPL konform sind Systemeigenschaften und Objektmanagement BearbeitenNeben dem kleinen Speicherbedarf fur die Programmbibliothek ist der Bedarf an Arbeitsspeicher zur Laufzeit ebenfalls gering und uberschreitet normalerweise 1 MB nicht Db4o kann nicht von aussen administriert werden Samtliche Einstellungen mussen uber den Programmcode vorgenommen werden Die Datenbank kann in gemischten Umgebungen eingesetzt werden Beispielsweise konnen zwei in C oder Java programmierte Client Anwendungen gemeinsam auf eine Datenbank zugreifen die von einer in Java oder C programmierten Server Anwendung betrieben wird Mit Hilfe des Alias Features von db4o konnen dabei Klassennamen umbenannt werden was beispielsweise wegen der unterschiedlichen Benennungskonventionen notwendig ist Eine der wichtigsten Vorteile von db4o Objekte konnen gespeichert werden ohne dass hierfur besondere Vorkehrungen getroffen werden mussen Es ist weder notwendig die zu speichernden Klassen von speziellen Oberklassen abzuleiten noch mussen spezielle Schnittstellen implementiert werden Auch eine Anreicherung des Bytecodes wie sie beispielsweise die Aspektorientierte Programmierung verwendet ist nicht notig Die Objekte konnen dabei beliebige Typen enthalten und zudem beliebig tief verschachtelt sein Mit dieser Eigenschaft ist es moglich Persistenz mit wenig Aufwand umzusetzen Grundlegende API BearbeitenAPI application programming interface bezeichnet die Programmierschnittstelle mit der die Datenbank programmiert wird Dabei zeigt sich dass der Unterschied zu anderen Programmen wie Hibernate oder JPA EJB nicht allzu gross ist Ein einfaches Codebeispiel das zusammenhangend ausgefuhrt werden sollte Offne eine Datenbank ObjectContainer db Db4o openFile C beispiel db try Speichere zwei Personen db store new Person John Doe TOP INC 45 db store new Person Clara Himmel BB Radio 30 Iteriere uber alle Personen ObjectSet result db queryByExample new Person while result hasNext System out println result next Verandere eine Person result db queryByExample new Person Clara Himmel Person found Person result next found setAge 25 db store found Losche eine Person db delete found Schreibe die Anderungen fest db commit finally Schliesse die Datenbank db close Ahnlich zu EJB JPA dort EntityManager wird zuerst ein ObjectContainer als Objektmanager erstellt Dieser Container kann entweder auf eine Datei verweisen oder in einer Client Server Architektur auf eine von einem Server bereitgestellte Datenbank Im ersten Fall werden alle Daten in einer Datei gespeichert Nachteil Die Daten sind also nicht komplett unabhangig von der Klasse der Programmiersprache Das Format ist proprietar und kann gegebenenfalls von nachfolgenden Programmiersprachen nicht mehr so einfach gelesen werden Vorteil Diese kann sehr leicht zwischen Firmen ausgetauscht werden Der Datenzugriff ist sehr schnell Danach werden alle CRUD Operationen Create Read Update und Delete ausgefuhrt CREATE Mit db store object wird ein beliebiges Objekt gespeichert Dies ist analog zum JPA Standard wo em persist object aufgerufen wird Allerdings muss in letzterem Fall das Domain Objekt mindestens mit a href Entit C3 A4t Auszeichnungssprache html title Entitat Auszeichnungssprache Entity a annotiert oder in XML registriert worden sein READ Es folgt eine einfache Suche mit der einfachsten Abfragesprache Query by Example Eine Personen Instanz wird als Muster erstellt und beliebige Felder werden gesetzt Zuruckgegeben werden alle Objekte in der Datenbank bei denen die Felder passen found enthalt daher das vollstandige Objekt das oben gespeichert wurde UPDATE Dieses found Objekt wird jetzt intern referenziert und kann daher verandert setAge 25 und nochmals gespeichert werden Dann ist es aktualisiert Im JPA Standard entspricht dieses einem em merge object wobei das Objekt immer attached also von der Session referenziert gemerkt werden muss DELETE db delete object loscht ein Objekt das dem Objektmanager bekannt sein muss Abfragesprachen BearbeitenDb4o bietet drei Abfragesprachen die alle nicht allzu weit von dem entfernt sind was Hibernate und JPA in EJB 3 0 bieten Query By Example QBE Bearbeiten Query by Example steht fur eine Suche anhand von Beispielen Die Grundlagen hierfur wurden bereits in den 1970er Jahren von Moshe M Zloof in einigen Artikeln gelegt Hibernate und db4o bieten diesen Mechanismus in einer leicht abgeschwachten Version an Bei db4o kann wie oben gezeigt ein beliebiges Objekt erstellt werden Danach wird entweder Kein Feld gesetzt so dass alle Felder null sind oder es wird direkt eine Referenz auf die Klasse ubergeben z B Person class In diesem Fall werden alle in der Datenbank gespeicherten Instanzen der Klasse zuruckgeliefert Es werden beliebig viele Felder gesetzt Dann werden alle gespeicherten Objekte zuruckgeliefert bei denen die im Muster gefullten Felder mit dem Wert im Objekt ubereinstimmen Es wird null ubergeben Dieses liefert alle Objekte aus der Datenbank zuruck Komplexe Abfragekriterien lassen sich bei Verwendung dieser Art der Abfrage nicht ausdrucken SODA Criteria Queries Bearbeiten Intern werden alle Abfragen bei db4o auf SODA abgebildet SODA ist die Programmierschnittstelle des auf SourceForge gehosteten Projekts S O D A Simple Object Database Access das teilweise von den Entwicklern von db4o betreut aber unabhangig von db4o entwickelt wird Die SODA Abfragen ahneln denen von Hibernate Criteria Abfragen stark Ein Beispiel Query query db query query constrain Person class query descend alter constrain 50 greater ObjectSet result query execute Hier wird die Abfrage zunachst auf die Klasse Person eingeschrankt danach weiter auf alle Personen die alter als 50 sind Es handelt sich bei dieser Abfrageart um ein Beispiel fur Query by API bei der Baume von Objekten erstellt werden mit denen Abfragen eingeschrankt werden Sie ist daher machtiger als die anderen Abfragemechanismen allerdings auch schwerer zu erstellen da der Code schwerer zu lesen ist Durch die Verwendung von Zeichenketten als Abfrageparameter wird die Typsicherheit zum Kompilationszeitpunkt nicht gewahrleistet Native Abfragen Bearbeiten Native Abfragen engl native queries sind Abfragen die in der Programmiersprache der Client Anwendung formuliert sind also bei db4o beispielsweise in Java oder C Der Code von nativen Abfragen wird bei db4o normalerweise nicht ausgefuhrt sondern zur Laufzeit analysiert Basierend auf dem Ergebnis der Analyse wird eine SODA Criteria Query erstellt Dieses hat den Vorteil dass die persistierten Objekte nicht zeitaufwandig instanziiert werden mussen Nur wenn die Analyse aufgrund der Komplexitat der Abfrage fehlschlagt wird die Objektinstanz erzeugt und der Programmcode der nativen Abfrage muss ausgefuhrt werden Zum Vergleich von nativen Abfragen und JPQL oder HQL sei hier auf Microsofts LINQ verwiesen Microsoft konnte die Sprache verandern und so machtige Abfragekonstrukte direkt in C einbetten Vorteile Bearbeiten Der Programmierer muss keine spezielle Abfragesprache wie z B SQL lernen Die Abfragen verwenden die Elemente der Programmiersprache und sind daher typsicher Bei der Umgestaltung Refactoring des Programms konnen die Abfragen berucksichtigt werden Fehlerhafte Abfragebefehle werden aus diesen Grunden fruhzeitiger erkannt oder durch die Vermeidung haufiger Ursachen eher vermieden als dieses bei Verwendung spezieller Abfragensprachen der Fall ist Nachteile Bearbeiten Die Erstellung der Abfrage ist komplett in der Hand der Entwickler und nicht unter Kontrolle von Administratoren die beispielsweise bei Verwendung von Stored Procedures Sicherheitsaspekte der Datenbank angemessen berucksichtigen konnen Native Abfragen sind nicht so machtig wie entsprechende Konstrukte in speziellen Abfragesprachen wie HQL oder JPQL In diesen Sprachen konnen besondere Abfragekriterien wie beispielsweise Verdichtung explizit ausgedruckt werden Beispiele Bearbeiten Entscheidend fur den komfortablen Einsatz ist ob und wie die verwendete Sprache Closures unterstutzt Ohne Closure Unterstutzung muss mit inneren Klassen oder ungebundenen Methodenzeigern beziehungsweise Delegaten gearbeitet werden um die Abfrage als freischwebender Code einer Methode zu ubergeben C NET 3 0 Verwendung eines Lambda Ausdrucks var persons db Query lt Person gt s gt s Age gt 50 C NET 2 0 Verwendung eines ungebundenen Methodenzeigers IList lt Person gt persons db Query lt Person gt delegate Person person return person Age gt 50 Java JDK 5 Verwendung einer generischen anonymen Klasse List lt Person gt personen db query new Predicate lt Person gt public boolean match Person person return person getAge gt 50 Java JDK 1 2 bis 1 4 Verwendung einer anonymen Klasse List personen db query new Predicate public boolean match Object object Person person Person object return person getAge gt 50 Java JDK 1 1 Verwendung einer inneren Klasse ObjectSet personen db query new PersonFilter public static class PersonFilter extends Predicate public boolean match Object object Person person Person object return person getAge gt 50 Transaktionen BearbeitenMit dem Offnen des Containers aus obigem Beispiel wird eine Transaktion erstellt Diese kann jederzeit mit db commit oder db rollback auf die Datenbank geschrieben oder verworfen werden Db4o garantiert dabei ein ACID Verhalten Alles innerhalb einer Transaktion entspricht den ACID Anforderungen Intern werden dabei alle Zugriffe auf die Datenbank innerhalb der Transaktion serialisiert Dies hat starke Konsequenzen fur das Datenbanksystem Durch das proprietare Datenformat ist der Zugriff fur einen Thread zwar meistens schneller als andere Kombinationen aus relationaler Datenbank und objektrelationalem Mapping Dennoch skaliert ein multithreaded Zugriff bei db4o noch nicht wie er beispielsweise fur den Bau von grossen Web Portalen notig ist Erfahrungen zufolge sind normalerweise bis zu einem Dutzend Zugriffe pro Sekunde realisierbar was fur viele Anwendungsfalle ausreichen kann db4o arbeitet jedoch wegen der obigen Punkte an einer Serverversion die auch bei nebenlaufigen Zugriffen skaliert Client Server Modes BearbeitenDb4o bietet mehrere Arbeitsmodi an Embedded Mode Es wird im Anwendungscode ein Objektcontainer geoffnet wie in obigem Beispiel gezeigt Basis ist hier ein dateibasierter Zugriff Client Server Mode Db4o kann als Server gestartet werden und dadurch von Clients Anfragen entgegennehmen Beispiel fur den Server ObjectServer server Db4oClientServer openServer c liveserver db 8732 server grantAccess user1 password server grantAccess user2 password Hier wird ein Thread geoffnet der auf Clientanfragen auf dem Port 8732 wartet Der Server selbst kann uber Monitore warten und beispielsweise Statusausgaben machen Zugriffsrechte konnen nicht direkt von aussen mittels eines Tools verwaltet werden Entweder werden diese im Code angelegt oder per Konsole etc eingelesen Ein Client konnte initial so eingerichtet werden aClient Db4oClientServer openClient 196 42 103 142 8732 user2 password Mittels eines sogenannten Out Of Band Signalling Kommunikationsprotokolls konnen dem Server beliebige Objekte gesendet werden mit denen ein Server administriert werden kann Beispielsweise kann die Aufforderung zum Defragmentieren der Datei ubermittelt werden Replikation BearbeitenMittels weniger Zeilen konnen beliebig viele Server repliziert geclustert werden Dies geschieht mit dem db4o dRS Modul Die Objekte bekommen dazu eine eindeutige UUID Dadurch konnen einzelne Objekte oder die gesamte Datenbank uni oder bidirektional verteilt werden d h jedes neue Objekt wird an alle anderen Datenbanken gesendet Dies erlaubt es grosse und redundante Architekturen aufzusetzen Sehr interessant ist ebenfalls die Option eine db4o Datenbank in relationale Datenbanken zu replizieren Dies bedeutet eine Brucke Verbindung zwischen beiden Welten die oft als getrennt angesehen werden db4o verwendet dazu Hibernate Nach der Konfiguration der dRS Bridge konnen ebenfalls einzelne Objekte oder ganze Datenbanken per Trigger wahlweise in eine oder beide Richtungen transferiert werden In vielen Fallen konnen in der Industrie so die Vorteile beider Welten gut ausgenutzt werden Ladeverhalten BearbeitenBei db4o gibt es drei Modi fur das Laden von Objekten IMMEDIATE Hier werden bei einer Abfrage alle gesuchten Objekte unmittelbar ermittelt Bei grossen Ergebnismengen kann dies viel Zeit und Arbeitsspeicher in Anspruch nehmen LAZY Hier wird sofort ein ObjectSet zuruckgeliefert jedoch ist noch kein Objekt ermittelt worden Ein Thread sucht alle weiteren Ergebnisse Dieses Verhalten ist ideal wenn die ersten Ergebnisse schnell angezeigt werden sollen Bei diesem Lademodus muss beachtet werden dass die Abfrage nicht zu einem definierten Zeitpunkt ausgewertet wird Hierdurch kann es zu Nebeneffekten kommen wenn zwischen dem Absetzen und dem vollstandigen Auswerten der Anfrage Anderungen am Datenbestand vorgenommen werden SNAPSHOT In diesem Zwischenmodus wird die Auswertung aller indizierten Bestandteile der Abfrage zu einem definierten Zeitpunkt vorgenommen Anschliessend wird der Zustand der moglichen Ergebnismenge in einem Snapshot aufgezeichnet Die weitere Verarbeitung der nichtindizierten Abfragebestandteile findet in einem nebenlaufigen Thread statt Hierdurch werden die Vorteile der verzogerter Auswertung unter Vermeidung ihrer Nebeneffekte bereitgestellt Fur den erzeugten Snapshot wird jedoch Arbeitsspeicher verwendet der erst mit Freigabe des ObjectSet freigegeben werden kann Objekte bilden normalerweise tiefe Referenzstrukturen In db4o kann beim Laden von Objekten angegeben werden bis zu welcher Tiefe referenzierte Objekte implizit mit dem Objekt geladen werden sollen Zusatzlich besteht die Moglichkeit diese referenzierten Objekte explizit zu einem spateren Zeitpunkt zu aktivieren Nahere Informationen zu Aktivierung Deaktivierung Abfrage und Aktualisierung referenzierter Objekte konnen in der db4o Referenz gefunden werden Callbacks BearbeitenBei db4o gibt es interne und externe Ruckruffunktionen callbacks Diese ahneln in ihrer Bedeutung den Datenbanktriggern anderer Datenbanken Ruckrufmechanismen gibt es in vielen Produkten zur Datenbankanbindung und sind ein machtiges Werkzeug um beispielsweise Uberprufungen durchzufuhren Standardwerte zu setzen oder Sicherheitsaspekte zu berucksichtigen Interne Callbacks Bearbeiten Interne Callbacks werden den Klassen der zu speichernden Objekte als Methoden hinzugefugt Diese werden von db4o dynamisch unter Verwendung der Reflexion erkannt und aufgerufen Hierzu ist es nicht notwendig die Klassen von speziellen Schnittstellen abzuleiten Vergleichbar mit den Join Points der aspektorientierten Programmierung sind Aufrufe interner Callbacks vor und nach datenbankbezogenen Ereignissen moglich Der Aufrufzeitpunkt wird hierbei durch das Prafix des Methodennamens festgelegt objectCan Methoden werden vor und objectOn Methoden werden nach dem Ereignis aufgerufen Durch den Ruckgabewert der objectCan Methoden kann gesteuert werden ob die mit dem Ereignis verbundene Aktion stattfinden soll Fur die internen Callbacks stehen folgende Ereignisse zur Verfugung New Update Delete Activate und Deactivate Externe Callbacks Bearbeiten Externe Callbacks sind keinen Klassen zugeordnet Stattdessen werden sie beim ObjectContainer registriert Zusatzlich zu den bei den internen Callbacks moglichen Ereignissen stehen fur diese Callbacks QueryStarted und QueryFinished zur Verfugung Die Verwendung externer Callback ermoglicht eine Ereignisbehandlung ohne Abanderung der zu speichernden Klassen Dieses kann den Vorteil haben dass Aspekte der Persistenz nicht mit der Geschaftslogik vermischt werden mussen Wenn der Quelltext der zu speichernden Klassen nicht zur Verfugung steht muss mit externen Callbacks gearbeitet werden Literatur BearbeitenJim Paterson Stefan Edlich Henrik Horning Reidar Horning The Definitive Guide to db4o Apress Inc Berkeley CA 2006 ISBN 978 1 59059 656 2 Patrick Romer Larysa Visengeriyeva db4o schnell kompakt Entwickler press Frankfurt 2006 ISBN 978 3 939084 03 7 William Cook Carl Rosenberger Native Queries for Persistent Objects In Dr Dobb s Journal Februar 2006 online englisch 132 kB William Cook Siddhartha Rai Safe Query Objects In Proceedings of the International Conference on Software Engineering ICSE 2005 S 97 106 online englisch PDF 143 kB Weblinks BearbeitenOffizielle Webprasenz englisch db4o Zusammenfassung Kurze Einfuhrung in db4o in Java von Ina Brenner der Autorin eines db4o Buchs db4o im Datenbank online LexikonEinzelnachweise Bearbeiten lytico db4o database for objects 3 Januar 2018 abgerufen am 14 Februar 2018 Alexander Neumann db4objects verkauft sein Datenbankengeschaft an Versant In Heise Newsticker Heise Verlag abgerufen am 17 Dezember 2008 deutsch Actian Corporation Completes Acquisition of Versant Abgerufen am 15 Februar 2018 englisch Abgerufen von https de wikipedia org w index php title Db4o amp oldid 238228911