<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Db4o</id>
	<title>Db4o - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Db4o"/>
	<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Db4o&amp;action=history"/>
	<updated>2026-05-30T02:45:37Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Wikipedia (Deutsch) – Lokale Kopie</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://wiki-de.moshellshocker.dns64.de/index.php?title=Db4o&amp;diff=1031520&amp;oldid=prev</id>
		<title>imported&gt;SchlurcherBot: Bot: http → https</title>
		<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Db4o&amp;diff=1031520&amp;oldid=prev"/>
		<updated>2026-04-16T03:01:29Z</updated>

		<summary type="html">&lt;p&gt;Bot: http → https&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{SEITENTITEL:db4o}}&lt;br /&gt;
{{Infobox Software&lt;br /&gt;
| Name = &lt;br /&gt;
| Logo = [[Datei:Db4o-logo.gif|250px|Db4o-Logo]]&lt;br /&gt;
| Screenshot = &lt;br /&gt;
| Beschreibung = &amp;lt;!-- Beschreibung des Screenshots! --&amp;gt;&lt;br /&gt;
| Maintainer = &lt;br /&gt;
| Hersteller = [[Versant|Versant Corporation]]&lt;br /&gt;
| Erscheinungsjahr = &lt;br /&gt;
| AktuelleVersion = 8.0&lt;br /&gt;
| AktuelleVersionFreigabeDatum = 1. Februar 2011&lt;br /&gt;
| AktuelleVorabVersion = &lt;br /&gt;
| AktuelleVorabVersionFreigabeDatum = &lt;br /&gt;
| Betriebssystem = [[Unix-Derivat]]e, [[Linux]], [[Microsoft Windows|Windows]]&lt;br /&gt;
| Programmiersprache = &lt;br /&gt;
| Kategorie = [[Datenbanksystem]], [[Server]]&lt;br /&gt;
| Lizenz = [[Duales Lizenzsystem]] ([[Proprietär]] und [[GNU General Public License|GPL]])&lt;br /&gt;
| Deutsch = nein&lt;br /&gt;
| Website = [https://web.archive.org/web/20141226082312/http://www.db4o.com/ www.db4o.com im Web Archiv]&lt;br /&gt;
| Dateien = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;db4o&amp;#039;&amp;#039;&amp;#039; (&amp;#039;&amp;#039;database for objects&amp;#039;&amp;#039;) ist eine [[Objektdatenbank]] für die [[Java-Plattform]] und das [[.Net-Framework]], deren Weiterentwicklung im Jahr 2011 eingestellt wurde. Der [[Quelltext|Quellcode]] ist noch auf [[GitHub|Github]] verfügbar.&amp;lt;ref&amp;gt;{{Internetquelle |autor=lytico |url=https://github.com/lytico/db4o |titel=db4o (database for objects) |datum=2018-01-03 |zugriff=2018-02-14}}&amp;lt;/ref&amp;gt; Sie gehört zu den [[NoSQL]]-Datenbanken. Die db4o-Programmbibliothek zeichnet sich durch einen vergleichsweise geringen Speicherbedarf von etwa 600&amp;amp;nbsp;kB aus. Dadurch eignet sie sich besonders für die [[Eingebettetes Datenbanksystem|Einbettung]] in andere Programme und für Umgebungen mit beschränkten Speicher-Ressourcen, wie beispielsweise [[Personal Digital Assistant|PDAs]]. Db4o konnte entweder unter den Bedingungen der GPL oder mit kommerziellen Lizenzen verwendet werden.&lt;br /&gt;
&lt;br /&gt;
db4o unterstützte Javas [[JDK]] 1.1.x bis 6.0 und lief nativ auf [[Jakarta EE]], [[J2SE]] und allen J2ME-Konfigurationen, deren [[J2ME#Profile|J2ME-Profil]] die [[Java (Programmiersprache)#Reflexion|Reflection-API]] bereitstellt. Daneben unterstützte db4o alle Sprachen, die auf der virtuellen Maschine [[Common Language Runtime|CLR]] der .NET-Plattform aufsetzen, wie beispielsweise [[C-Sharp|C#]] oder [[VB.NET]]. Der für die .NET-Plattform notwendige C#-Quellcode der db4o-Programmbibliothek wurde dabei größtenteils aus dem Java-Quellcode generiert und ist auch auf der [[Mono-Projekt|Mono]]-Implementierung der .NET-Plattform lauffähig.&lt;br /&gt;
&lt;br /&gt;
== Historie ==&lt;br /&gt;
Das db4o-Projekt begann im Jahr 2000 unter Führung 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 Systems|Wind River]]) gegründet wurde.&lt;br /&gt;
&lt;br /&gt;
Im Dezember 2008 wurde die Datenbanksparte an [[Versant]] verkauft.&amp;lt;ref&amp;gt;{{Internetquelle |autor=Alexander Neumann |url=https://www.heise.de/developer/meldung/db4objects-verkauft-sein-Datenbankengeschaeft-an-Versant-190625.html |titel=db4objects verkauft sein Datenbankengeschäft an Versant |werk=Heise Newsticker |hrsg=Heise Verlag |datum= |zugriff=2008-12-17 |sprache=de-DE}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
db4o wird derzeit nicht mehr weiterentwickelt. Die Webseite www.db4o.com ist nicht mehr erreichbar, und die letzte Änderung bei Sourceforge war 2015, weiterhin gehört Versant seit Dezember 2012 zu Actian.&amp;lt;ref&amp;gt;{{Internetquelle |url=http://supportservices.actian.com/press/actian-completes-acquisition-versant |titel=Actian Corporation Completes Acquisition of Versant |zugriff=2018-02-15 |sprache=en}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Lizenz ==&lt;br /&gt;
db4o wurde seit 2004 wahlweise unter der [[GNU General Public License|GPL]] als [[freie Software]] lizenziert oder unter einer kommerziellen Lizenz, die die Verwendung in nicht-GPL-Projekten erlaubt. Daneben gab es eine Classpath-ähnliche Lizenz, die es erlaubt, db4o in [[Open Source|Open-Source]]-Projekte zu integrieren, die nicht db4o / GPL konform sind.&lt;br /&gt;
&lt;br /&gt;
== Systemeigenschaften und Objektmanagement ==&lt;br /&gt;
* Neben dem kleinen Speicherbedarf für die [[Programmbibliothek]] ist der Bedarf an [[Arbeitsspeicher]] zur Laufzeit ebenfalls gering und überschreitet normalerweise 1&amp;amp;nbsp;MB nicht.&lt;br /&gt;
* db4o kann nicht von außen administriert werden. Sämtliche Einstellungen müssen über den Programmcode vorgenommen werden.&lt;br /&gt;
* Die Datenbank kann in gemischten Umgebungen eingesetzt werden: Beispielsweise können 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 können dabei Klassennamen umbenannt werden, was beispielsweise wegen der unterschiedlichen Benennungskonventionen notwendig ist.&lt;br /&gt;
* Eine der wichtigsten Vorteile von db4o: Objekte können gespeichert werden, ohne dass hierfür besondere Vorkehrungen getroffen werden müssen. Es ist weder notwendig, die zu speichernden Klassen von speziellen [[Vererbung (Programmierung)|Oberklassen]] abzuleiten, noch müssen spezielle [[Schnittstelle#Softwareschnittstelle|Schnittstellen]] implementiert werden. Auch eine Anreicherung des [[Bytecode]]s, wie sie beispielsweise die [[Aspektorientierte Programmierung]] verwendet, ist nicht nötig. Die Objekte können dabei beliebige Typen enthalten und zudem beliebig tief verschachtelt sein.&lt;br /&gt;
* Mit dieser Eigenschaft ist es möglich, [[Persistenz (Informatik)|Persistenz]] mit wenig Aufwand umzusetzen.&lt;br /&gt;
&lt;br /&gt;
== Grundlegende API ==&lt;br /&gt;
API (&amp;#039;&amp;#039;application programming interface&amp;#039;&amp;#039;) bezeichnet die [[Programmierschnittstelle]], mit der die Datenbank programmiert wird. Dabei zeigt sich, dass der Unterschied zu anderen Programmen wie [[Hibernate (Framework)|Hibernate]] oder [[Jakarta Persistence API|JPA]] / [[Enterprise JavaBeans|EJB]] nicht allzu groß ist.&lt;br /&gt;
&lt;br /&gt;
Ein einfaches Codebeispiel, das zusammenhängend ausgeführt werden sollte:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
   // Öffne eine Datenbank&lt;br /&gt;
   ObjectContainer db = Db4o.openFile(&amp;quot;C:/beispiel.db&amp;quot;);&lt;br /&gt;
   try {&lt;br /&gt;
      // Speichere zwei Personen&lt;br /&gt;
      db.store(new Person(&amp;quot;John Doe&amp;quot;,&amp;quot;TOP INC&amp;quot;,45));&lt;br /&gt;
      db.store(new Person(&amp;quot;Clara Himmel&amp;quot;,&amp;quot;BB Radio&amp;quot;,30));&lt;br /&gt;
      // Iteriere über alle Personen&lt;br /&gt;
      ObjectSet result = db.queryByExample(new Person());&lt;br /&gt;
      while (result.hasNext()) {&lt;br /&gt;
          System.out.println(result.next());&lt;br /&gt;
      }&lt;br /&gt;
      // Verändere eine Person&lt;br /&gt;
      result = db.queryByExample(new Person(&amp;quot;Clara Himmel&amp;quot;));&lt;br /&gt;
      Person found = (Person) result.next();&lt;br /&gt;
      found.setAge(25);&lt;br /&gt;
      db.store(found);&lt;br /&gt;
      // Lösche eine Person&lt;br /&gt;
      db.delete(found);&lt;br /&gt;
      // Schreibe die Änderungen fest&lt;br /&gt;
      db.commit();&lt;br /&gt;
   }&lt;br /&gt;
   finally {&lt;br /&gt;
      // Schließe die Datenbank&lt;br /&gt;
      db.close();&lt;br /&gt;
   }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Ähnlich zu EJB / JPA (dort &amp;lt;code&amp;gt;EntityManager&amp;lt;/code&amp;gt;) wird zuerst ein &amp;lt;code&amp;gt;ObjectContainer&amp;lt;/code&amp;gt; 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.&lt;br /&gt;
** Nachteil: Die Daten sind also nicht komplett unabhängig von der Klasse der Programmiersprache. Das Format ist proprietär und kann gegebenenfalls von nachfolgenden Programmiersprachen nicht mehr so einfach gelesen werden.&lt;br /&gt;
** Vorteil: Diese kann sehr leicht zwischen Firmen ausgetauscht werden. Der Datenzugriff ist sehr schnell.&lt;br /&gt;
&lt;br /&gt;
Danach werden alle [[CRUD]]-Operationen (&amp;#039;&amp;#039;C&amp;#039;&amp;#039;reate, &amp;#039;&amp;#039;R&amp;#039;&amp;#039;ead, &amp;#039;&amp;#039;U&amp;#039;&amp;#039;pdate und &amp;#039;&amp;#039;D&amp;#039;&amp;#039;elete) ausgeführt:&lt;br /&gt;
; CREATE: Mit &amp;lt;code&amp;gt;db.store(object)&amp;lt;/code&amp;gt; wird ein beliebiges Objekt gespeichert. Dies ist analog zum JPA-Standard, wo &amp;lt;code&amp;gt;em.persist(object)&amp;lt;/code&amp;gt; aufgerufen wird. Allerdings muss in letzterem Fall das Domain-Objekt mindestens mit &amp;lt;code&amp;gt;[[Entität (Auszeichnungssprache)|@Entity]]&amp;lt;/code&amp;gt; annotiert oder in [[XML]] registriert worden sein.&lt;br /&gt;
; READ: Es folgt eine einfache Suche mit der einfachsten Abfragesprache &amp;#039;&amp;#039;Query by Example&amp;#039;&amp;#039;. Eine Personen-Instanz wird als Muster erstellt und beliebige Felder werden gesetzt. Zurückgegeben werden alle Objekte in der Datenbank, bei denen die Felder passen. &amp;lt;code&amp;gt;found&amp;lt;/code&amp;gt; enthält daher das vollständige Objekt, das oben gespeichert wurde.&lt;br /&gt;
; UPDATE: Dieses &amp;lt;code&amp;gt;found&amp;lt;/code&amp;gt;-Objekt wird jetzt intern referenziert und kann daher verändert &amp;lt;code&amp;gt;.setAge(25)&amp;lt;/code&amp;gt;und nochmals gespeichert werden. Dann ist es aktualisiert. Im JPA Standard entspricht dieses einem &amp;lt;code&amp;gt;em.merge(object)&amp;lt;/code&amp;gt;, wobei das Objekt immer &amp;#039;&amp;#039;attached&amp;#039;&amp;#039;, also von der Session referenziert (&amp;#039;&amp;#039;gemerkt&amp;#039;&amp;#039;) werden muss.&lt;br /&gt;
; DELETE: &amp;lt;code&amp;gt;db.delete(object)&amp;lt;/code&amp;gt; löscht ein Objekt, das dem Objektmanager bekannt sein muss.&lt;br /&gt;
&lt;br /&gt;
== Abfragesprachen ==&lt;br /&gt;
db4o bietet drei [[Abfragesprache]]n, die alle nicht allzu weit von dem entfernt sind, was [[Hibernate (Framework)|Hibernate]] und JPA in EJB 3.0 bieten:&lt;br /&gt;
&lt;br /&gt;
=== Query By Example (QBE) ===&lt;br /&gt;
[[Query by Example]] steht für eine Suche anhand von Beispielen. Die Grundlagen hierfür wurden bereits in den 1970er Jahren von Moshé M. Zloof in einigen Artikeln gelegt. Hibernate und db4o bieten diesen Mechanismus in einer leicht abgeschwächten Version an.&lt;br /&gt;
&lt;br /&gt;
Bei db4o kann, wie oben gezeigt, ein beliebiges Objekt erstellt werden. Danach wird entweder:&lt;br /&gt;
* Kein Feld gesetzt, so dass alle Felder null sind, oder es wird direkt eine [[Referenz (Programmierung)|Referenz]] auf die Klasse übergeben (z.&amp;amp;nbsp;B. &amp;lt;code&amp;gt;Person.class&amp;lt;/code&amp;gt;): In diesem Fall werden alle in der Datenbank gespeicherten [[Objekt (Programmierung)#Instanziierung|Instanzen]] der Klasse zurückgeliefert.&lt;br /&gt;
* Es werden beliebig viele Felder gesetzt: Dann werden alle gespeicherten Objekte zurückgeliefert, bei denen die im Muster gefüllten Felder mit dem Wert im Objekt übereinstimmen.&lt;br /&gt;
* Es wird &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; übergeben: Dieses liefert alle Objekte aus der Datenbank zurück.&lt;br /&gt;
&lt;br /&gt;
Komplexe Abfragekriterien lassen sich bei Verwendung dieser Art der Abfrage nicht ausdrücken.&lt;br /&gt;
&lt;br /&gt;
=== SODA / Criteria Queries ===&lt;br /&gt;
Intern werden alle Abfragen bei db4o auf SODA abgebildet. SODA ist die Programmierschnittstelle des auf [[SourceForge]] gehosteten Projekts &amp;#039;&amp;#039;S.O.D.A. – Simple Object Database Access&amp;#039;&amp;#039;, das teilweise von den Entwicklern von db4o betreut, aber unabhängig von db4o entwickelt wird.&lt;br /&gt;
&lt;br /&gt;
Die SODA-Abfragen ähneln denen von &amp;#039;&amp;#039;Hibernate-Criteria&amp;#039;&amp;#039;-Abfragen stark. Ein Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
  Query query=db.query();&lt;br /&gt;
  query.constrain(Person.class);&lt;br /&gt;
  query.descend(&amp;quot;alter&amp;quot;).constrain(50).greater();&lt;br /&gt;
  ObjectSet result=query.execute();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier wird die Abfrage zunächst auf die Klasse Person eingeschränkt, danach weiter auf alle Personen, die älter als 50 sind.&lt;br /&gt;
&lt;br /&gt;
Es handelt sich bei dieser Abfrageart um ein Beispiel für &amp;#039;&amp;#039;Query by API&amp;#039;&amp;#039;, bei der [[Baum (Informatik)|Bäume]] von Objekten erstellt werden, mit denen Abfragen eingeschränkt werden. Sie ist daher mächtiger 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 gewährleistet.&lt;br /&gt;
&lt;br /&gt;
=== Native Abfragen ===&lt;br /&gt;
Native Abfragen (engl. &amp;#039;&amp;#039;native queries&amp;#039;&amp;#039;) sind Abfragen, die in der Programmiersprache der Client-Anwendung formuliert sind, also bei db4o beispielsweise in Java oder C#.&lt;br /&gt;
&lt;br /&gt;
Der Code von nativen Abfragen wird bei db4o normalerweise nicht ausgeführt, sondern zur Laufzeit analysiert. Basierend auf dem Ergebnis der Analyse wird eine &amp;#039;&amp;#039;SODA-Criteria-Query&amp;#039;&amp;#039; erstellt. Dieses hat den Vorteil, dass die persistierten Objekte nicht zeitaufwändig instanziiert werden müssen. Nur wenn die Analyse aufgrund der Komplexität der Abfrage fehlschlägt, wird die Objektinstanz erzeugt und der Programmcode der nativen Abfrage muss ausgeführt werden.&lt;br /&gt;
&lt;br /&gt;
Zum Vergleich von nativen Abfragen und [[JPQL]] oder [[Hibernate Query Language|HQL]] sei hier auf Microsofts [[LINQ]] verwiesen. Microsoft konnte die Sprache verändern und so mächtige Abfragekonstrukte direkt in C# einbetten.&lt;br /&gt;
&lt;br /&gt;
==== Vorteile ====&lt;br /&gt;
* Der Programmierer muss keine spezielle Abfragesprache, wie z.&amp;amp;nbsp;B. [[SQL]], lernen.&lt;br /&gt;
* Die Abfragen verwenden die Elemente der Programmiersprache und sind daher typsicher.&lt;br /&gt;
* Bei der Umgestaltung ([[Refactoring]]) des Programms können die Abfragen berücksichtigt werden.&lt;br /&gt;
Fehlerhafte Abfragebefehle werden aus diesen Gründen frühzeitiger erkannt oder durch die Vermeidung häufiger Ursachen eher vermieden, als dieses bei Verwendung spezieller Abfragensprachen der Fall ist.&lt;br /&gt;
&lt;br /&gt;
==== Nachteile ====&lt;br /&gt;
* Die Erstellung der Abfrage ist komplett in der Hand der Entwickler und nicht unter Kontrolle von Administratoren, die beispielsweise bei Verwendung von [[Stored Procedure]]s Sicherheitsaspekte der Datenbank angemessen berücksichtigen können.&lt;br /&gt;
* Native Abfragen sind nicht so mächtig wie entsprechende Konstrukte in speziellen Abfragesprachen wie [[Hibernate (Framework)|HQL]] oder JPQL. In diesen Sprachen können besondere Abfragekriterien, wie beispielsweise [[Aggregation (OLAP)|Verdichtung]], explizit ausgedrückt werden.&lt;br /&gt;
&lt;br /&gt;
==== Beispiele ====&lt;br /&gt;
Entscheidend für den komfortablen Einsatz ist, ob und wie die verwendete Sprache [[Closure (Funktion)|Closures]] unterstützt. Ohne Closure-Unterstützung muss mit inneren Klassen oder [[Methodenzeiger#Ungebundene Methodenzeiger|ungebundenen Methodenzeigern]] beziehungsweise [[Methodenzeiger#Delegates|Delegaten]] gearbeitet werden, um die Abfrage als „freischwebender Code“ einer Methode zu übergeben.&lt;br /&gt;
&lt;br /&gt;
C# .NET 3.0 (Verwendung eines [[Lambda-Ausdruck]]s);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
  var persons = db.Query&amp;lt;Person&amp;gt;( s =&amp;gt; s.Age &amp;gt; 50 );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
C# .NET 2.0 (Verwendung eines ungebundenen Methodenzeigers):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
  IList&amp;lt;Person&amp;gt; persons = db.Query&amp;lt;Person&amp;gt;( delegate(Person person){&lt;br /&gt;
    return person.Age &amp;gt; 50;&lt;br /&gt;
  });&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Java JDK 5 (Verwendung einer generischen anonymen Klasse):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
  List&amp;lt;Person&amp;gt; personen = db.query(new Predicate&amp;lt;Person&amp;gt;() {&lt;br /&gt;
    public boolean match(Person person) {&lt;br /&gt;
      return person.getAge() &amp;gt; 50;&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Java JDK 1.2 bis 1.4 (Verwendung einer anonymen Klasse):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
  List personen = db.query(new Predicate() {&lt;br /&gt;
    public boolean match(Object object) {&lt;br /&gt;
      Person person = (Person)object;&lt;br /&gt;
      return person.getAge() &amp;gt; 50;&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Java JDK 1.1 (Verwendung einer inneren Klasse):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
  ObjectSet personen = db.query(new PersonFilter());&lt;br /&gt;
&lt;br /&gt;
  public static class PersonFilter extends Predicate {&lt;br /&gt;
    public boolean match(Object object) {&lt;br /&gt;
      Person person = (Person)object;&lt;br /&gt;
      return person.getAge() &amp;gt; 50;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Transaktionen ==&lt;br /&gt;
Mit dem Öffnen des Containers aus obigem Beispiel wird eine [[Transaktion (Informatik)|Transaktion]] erstellt. Diese kann jederzeit mit &amp;lt;code&amp;gt;db.commit()&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;db.rollback()&amp;lt;/code&amp;gt; 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 für das Datenbanksystem:&lt;br /&gt;
* Durch das proprietäre [[Datenformat]] ist der Zugriff für einen [[Thread (Informatik)|Thread]] zwar meistens schneller als andere Kombinationen aus relationaler Datenbank und objektrelationalem Mapping.&lt;br /&gt;
* Dennoch skaliert ein „multithreaded“ Zugriff bei db4o noch nicht, wie er beispielsweise für den Bau von großen Web-Portalen nötig ist.&lt;br /&gt;
&lt;br /&gt;
Erfahrungen zufolge sind normalerweise bis zu einem Dutzend Zugriffe pro Sekunde realisierbar, was für viele Anwendungsfälle ausreichen kann. db4o arbeitet jedoch wegen der obigen Punkte an einer Serverversion, die auch bei nebenläufigen Zugriffen skaliert.&lt;br /&gt;
&lt;br /&gt;
== Client- / Server-Modes ==&lt;br /&gt;
db4o bietet mehrere Arbeitsmodi an:&lt;br /&gt;
# &amp;#039;&amp;#039;[[Eingebettetes System|Embedded]] Mode&amp;#039;&amp;#039;: Es wird im Anwendungscode ein Objektcontainer geöffnet, wie in obigem Beispiel gezeigt. Basis ist hier ein dateibasierter Zugriff.&lt;br /&gt;
# &amp;#039;&amp;#039;Client / Server Mode&amp;#039;&amp;#039;: db4o kann als Server gestartet werden und dadurch von Clients Anfragen entgegennehmen.&lt;br /&gt;
Beispiel für den Server:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
ObjectServer server = Db4oClientServer.openServer(&amp;quot;c:/liveserver.db&amp;quot;, 8732);&lt;br /&gt;
server.grantAccess(&amp;quot;user1&amp;quot;, &amp;quot;password&amp;quot;);&lt;br /&gt;
server.grantAccess(&amp;quot;user2&amp;quot;, &amp;quot;password&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Hier wird ein Thread geöffnet, der auf Clientanfragen auf dem Port 8732 wartet. Der Server selbst kann über [[Monitor (Informatik)|Monitore]] warten und beispielsweise Statusausgaben machen. Zugriffsrechte können nicht direkt von außen mittels eines Tools verwaltet werden. Entweder werden diese im Code angelegt oder per Konsole etc. eingelesen.&lt;br /&gt;
&lt;br /&gt;
Ein Client könnte initial so eingerichtet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
aClient = Db4oClientServer.openClient(&amp;quot;196.42.103.142&amp;quot;, 8732, &amp;quot;user2&amp;quot;, &amp;quot;password&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mittels eines sogenannten „Out-Of-Band Signalling“-Kommunikationsprotokolls können dem Server beliebige Objekte gesendet werden, mit denen ein Server administriert werden kann. Beispielsweise kann die Aufforderung zum Defragmentieren der Datei übermittelt werden.&lt;br /&gt;
&lt;br /&gt;
== Replikation ==&lt;br /&gt;
Mittels weniger Zeilen können beliebig viele Server repliziert (geclustert) werden. Dies geschieht mit dem db4o-&amp;#039;&amp;#039;dRS&amp;#039;&amp;#039;-Modul.&lt;br /&gt;
&lt;br /&gt;
Die Objekte bekommen dazu eine eindeutige [[UUID]]. Dadurch können einzelne Objekte oder die gesamte Datenbank uni- oder bidirektional verteilt werden, d.&amp;amp;nbsp;h., jedes neue Objekt wird an alle anderen Datenbanken gesendet. Dies erlaubt es große und redundante Architekturen aufzusetzen.&lt;br /&gt;
&lt;br /&gt;
Sehr interessant ist ebenfalls die Option, eine db4o-Datenbank in [[relationale Datenbank]]en zu replizieren. Dies bedeutet eine Brücke / Verbindung zwischen beiden Welten, die oft als getrennt angesehen werden. db4o verwendet dazu [[Hibernate (Framework)|Hibernate]]. Nach der Konfiguration der dRS-Bridge können ebenfalls einzelne Objekte oder ganze Datenbanken per Trigger wahlweise in eine oder beide Richtungen transferiert werden. In vielen Fällen können in der Industrie so die Vorteile beider Welten gut ausgenutzt werden.&lt;br /&gt;
&lt;br /&gt;
== Ladeverhalten ==&lt;br /&gt;
Bei db4o gibt es drei Modi für das Laden von Objekten:&lt;br /&gt;
; &amp;lt;code&amp;gt;IMMEDIATE&amp;lt;/code&amp;gt;: Hier werden bei einer Abfrage alle gesuchten Objekte unmittelbar ermittelt. Bei großen Ergebnismengen kann dies viel Zeit und Arbeitsspeicher in Anspruch nehmen.&lt;br /&gt;
; &amp;lt;code&amp;gt;LAZY&amp;lt;/code&amp;gt;: Hier wird sofort ein &amp;lt;code&amp;gt;ObjectSet&amp;lt;/code&amp;gt; zurückgeliefert, jedoch ist noch kein Objekt ermittelt worden. Ein [[Thread (Informatik)|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 vollständigen Auswerten der Anfrage Änderungen am Datenbestand vorgenommen werden.&lt;br /&gt;
; &amp;lt;code&amp;gt;SNAPSHOT&amp;lt;/code&amp;gt;: In diesem Zwischenmodus wird die Auswertung aller indizierten Bestandteile der Abfrage zu einem definierten Zeitpunkt vorgenommen. Anschließend wird der Zustand der möglichen Ergebnismenge in einem [[Schnappschuss (Informationstechnik)|Snapshot]] aufgezeichnet. Die weitere Verarbeitung der nichtindizierten Abfragebestandteile findet in einem nebenläufigen Thread statt. Hierdurch werden die Vorteile der verzögerter Auswertung unter Vermeidung ihrer Nebeneffekte bereitgestellt. Für den erzeugten Snapshot wird jedoch Arbeitsspeicher verwendet, der erst mit Freigabe des &amp;lt;code&amp;gt;ObjectSet&amp;lt;/code&amp;gt; freigegeben werden kann.&lt;br /&gt;
&lt;br /&gt;
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. Zusätzlich besteht die Möglichkeit, diese referenzierten Objekte explizit zu einem späteren Zeitpunkt zu aktivieren. Nähere Informationen zu Aktivierung, Deaktivierung, Abfrage und Aktualisierung referenzierter Objekte können in der db4o-Referenz gefunden werden.&lt;br /&gt;
&lt;br /&gt;
== Callbacks ==&lt;br /&gt;
Bei db4o gibt es interne und externe [[Rückruffunktion]]en (&amp;#039;&amp;#039;callbacks&amp;#039;&amp;#039;). Diese ähneln in ihrer Bedeutung den [[Datenbanktrigger]]n anderer Datenbanken. Rückrufmechanismen gibt es in vielen Produkten zur Datenbankanbindung. Sie sind ein mächtiges Werkzeug um beispielsweise Überprüfungen durchzuführen, Standardwerte zu setzen oder Sicherheitsaspekte zu berücksichtigen.&lt;br /&gt;
&lt;br /&gt;
=== Interne Callbacks ===&lt;br /&gt;
Interne Callbacks werden den Klassen der zu speichernden Objekte als Methoden hinzugefügt. Diese werden von db4o dynamisch unter Verwendung der [[Reflexion (Programmierung)|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 möglich. Der Aufrufzeitpunkt wird hierbei durch das [[Präfix]] des Methodennamens festgelegt: &amp;lt;code&amp;gt;objectCan...&amp;lt;/code&amp;gt;–Methoden werden vor und &amp;lt;code&amp;gt;objectOn...&amp;lt;/code&amp;gt;–Methoden werden nach dem Ereignis aufgerufen. Durch den Rückgabewert der &amp;lt;code&amp;gt;objectCan...&amp;lt;/code&amp;gt;–Methoden kann gesteuert werden, ob die mit dem Ereignis verbundene Aktion stattfinden soll. Für die internen Callbacks stehen folgende Ereignisse zur Verfügung: &amp;lt;code&amp;gt;New&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Update&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Delete&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Activate&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;Deactivate&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Externe Callbacks ===&lt;br /&gt;
Externe Callbacks sind keinen Klassen zugeordnet. Stattdessen werden sie beim &amp;lt;code&amp;gt;ObjectContainer&amp;lt;/code&amp;gt; registriert. Zusätzlich zu den bei den internen Callbacks möglichen Ereignissen stehen für diese Callbacks &amp;lt;code&amp;gt;QueryStarted&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;QueryFinished&amp;lt;/code&amp;gt; zur Verfügung. Die Verwendung externer Callback ermöglicht eine Ereignisbehandlung ohne Abänderung der zu speichernden Klassen. Dieses kann den Vorteil haben, dass Aspekte der Persistenz nicht mit der [[Geschäftslogik]] vermischt werden müssen. Wenn der Quelltext der zu speichernden Klassen nicht zur Verfügung steht, muss mit externen Callbacks gearbeitet werden.&lt;br /&gt;
&lt;br /&gt;
== Literatur ==&lt;br /&gt;
* Jim Paterson, Stefan Edlich, Henrik Hörning, Reidar Hörning: &amp;#039;&amp;#039;The Definitive Guide to db4o&amp;#039;&amp;#039; Apress Inc., Berkeley CA 2006, ISBN 978-1-59059-656-2.&lt;br /&gt;
* Patrick Römer, Larysa Visengeriyeva: &amp;#039;&amp;#039;db4o. schnell + kompakt&amp;#039;&amp;#039;. Entwickler.press, Frankfurt 2006, ISBN 978-3-939084-03-7.&lt;br /&gt;
* William Cook, Carl Rosenberger: &amp;#039;&amp;#039;Native Queries for Persistent Objects&amp;#039;&amp;#039;. In &amp;#039;&amp;#039;Dr.&amp;amp;nbsp;Dobb’s Journal&amp;#039;&amp;#039;. Februar 2006 ([https://www.cs.utexas.edu/~wcook/papers/NativeQueries/NativeQueries8-23-05.pdf online]; englisch; 132&amp;amp;nbsp;kB).&lt;br /&gt;
* William Cook, Siddhartha Rai: &amp;#039;&amp;#039;Safe Query Objects&amp;#039;&amp;#039;. In &amp;#039;&amp;#039;Proceedings of the International Conference on Software Engineering (ICSE)&amp;#039;&amp;#039;. 2005. S. 97–106 ([https://www.cs.utexas.edu/~wcook/papers/SafeQuery05/SafeQueryFinal.pdf online]; englisch; PDF; 143&amp;amp;nbsp;kB).&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [http://db4o.com/ Offizielle Webpräsenz] (englisch)&lt;br /&gt;
* [http://db4o.com/deutsch/ db4o-Zusammenfassung]&lt;br /&gt;
* [https://www.theserverside.de/eine-kurze-einfuhrung-in-db4o/ Kurze Einführung in db4o in Java – von Ina Brenner, der Autorin eines db4o-Buchs]&lt;br /&gt;
* [http://wikis.gm.fh-koeln.de/wiki_db/Datenbanken/Db4o db4o im Datenbank online Lexikon]&lt;br /&gt;
&lt;br /&gt;
== Einzelnachweise ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Freies Datenbankmanagementsystem]]&lt;br /&gt;
[[Kategorie:Abkürzung]]&lt;br /&gt;
[[Kategorie:NoSQL]]&lt;/div&gt;</summary>
		<author><name>imported&gt;SchlurcherBot</name></author>
	</entry>
</feed>