Frage

Ich probiere gerade db4o (die Java-Version) aus und mir gefällt ziemlich gut, was ich sehe.Aber ich frage mich, wie es in einer echten Live-(Web-)Umgebung funktioniert.Hat jemand Erfahrungen (gute oder schlechte) mit der Ausführung von db4o?

War es hilfreich?

Lösung

Wir führen die DB40 .NET-Version in einem großen Client/Server-Projekt aus.

Unsere Erfahrung zeigt, dass Sie möglicherweise eine viel bessere Leistung als mit typischen relationalen Datenbanken erzielen können.

Allerdings müssen Sie Ihre Objekte wirklich optimieren, um diese Art von Leistung zu erzielen.Wenn Sie beispielsweise eine Liste mit vielen Objekten haben, ist die DB4O-Aktivierung dieser Listen langsam.Es gibt verschiedene Möglichkeiten, dieses Problem zu umgehen, beispielsweise durch Umkehrung der Beziehung.

Ein weiterer Schmerz ist die Aktivierung.Wenn Sie ein Objekt aus DB4O abrufen oder löschen, wird standardmäßig der gesamte Objektbaum aktiviert.Wenn Sie beispielsweise ein Foo laden, wird Foo.Bar.Baz.Bat usw. geladen, bis nichts mehr zum Laden übrig ist.Aus programmtechnischer Sicht ist das zwar schön, aber die Leistung wird durch die stärkere Verschachtelung in Ihren Objekten langsamer.Um die Leistung zu verbessern, können Sie DB4O mitteilen, wie viele Ebenen tief aktiviert werden sollen.Dies ist zeitaufwändig, wenn Sie viele Objekte haben.

Ein weiterer Problembereich war die Textsuche.Die Textsuche von DB4O ist weitaus langsamer als die SQL-Volltextindizierung.(Sie werden Ihnen dies direkt auf ihrer Website mitteilen.) Die gute Nachricht ist, dass es einfach ist, eine Textsuchmaschine auf Basis von DB4O einzurichten.In unserem Projekt haben wir Lucene.NET angeschlossen, um die gewünschten Textfelder zu indizieren.

Einige APIs scheinen nicht zu funktionieren, beispielsweise die GetField-APIs, die bei der Anwendung von Datenbank-Upgrades hilfreich sind.(Wenn Sie beispielsweise eine Eigenschaft umbenannt haben und Ihre vorhandenen Objekte in der Datenbank aktualisieren möchten, müssen Sie diese „Reflexions“-APIs verwenden, um Objekte in der Datenbank zu finden.Andere APIs, wie das [Index]-Attribut, funktionieren in der stabilen Version 6.4 nicht, und Sie müssen stattdessen Indizes mithilfe von „Configure().Index(“someField“) angeben, das nicht stark typisiert ist.

Wir haben beobachtet, dass die Leistung abnimmt, je größer Ihre Datenbank ist.Wir haben derzeit eine 1-GB-Datenbank und die Dinge sind immer noch schnell, aber nicht annähernd so schnell wie zu Beginn mit einer winzigen Datenbank.

Wir haben ein weiteres Problem gefunden, bei dem Db4O.GetByID die Datenbank schließt, wenn die ID nicht mehr in der Datenbank vorhanden ist.

Wir haben festgestellt, dass die native Abfragesyntax (die natürlichste, sprachintegrierte Syntax für Abfragen) weitaus langsamer ist als die weniger benutzerfreundlichen SODA-Abfragen.Anstatt also zu tippen:

// C# syntax for "Find all MyFoos with Bar == 23".
// (Note the Java syntax is more verbose using the Predicate class.)
IList<MyFoo> results = db4o.Query<MyFoo>(input => input.Bar == 23);

Anstelle dieses netten Abfragecodes benötigen Sie eine hässliche SODA-Abfrage, die auf Zeichenfolgen basiert und nicht stark typisiert ist.

Für .NET-Leute haben sie kürzlich einen LINQ-to-DB4O-Anbieter eingeführt, der die bisher beste Syntax bietet.Es bleibt jedoch abzuwarten, ob die Leistung mit den hässlichen SODA-Abfragen mithalten kann.

Die DB4O-Unterstützung war anständig:Wir haben mehrmals mit ihnen telefoniert und hilfreiche Informationen erhalten.Ihre Benutzerforen sind nahezu wertlos, allerdings bleiben fast alle Fragen unbeantwortet.Ihr JIRA-Bug-Tracker erhält viel Aufmerksamkeit. Wenn Sie also einen lästigen Fehler haben, melden Sie ihn bei JIRA an, damit er häufig behoben wird.(Wir hatten zwei Fehler, die behoben wurden, und einen weiteren, der halbherzig gepatcht wurde.)

Falls Sie das alles nicht abgeschreckt hat, möchte ich sagen, dass wir mit DB4O trotz der aufgetretenen Probleme sehr zufrieden sind.Die Leistung, die wir haben, hat einige O/RM-Frameworks, die wir ausprobiert haben, umgehauen.Ich empfehle es.

Update Juli 2015 Denken Sie daran, dass diese Antwort bereits 2008 geschrieben wurde.Obwohl ich die positiven Stimmen zu schätzen weiß, hat sich die Welt seitdem verändert und diese Informationen sind möglicherweise nicht mehr so ​​zuverlässig wie zum Zeitpunkt ihrer Erstellung.

Andere Tipps

Die meisten nativen Abfragen können und werden hinter den Kulissen effizient in SODA-Abfragen umgewandelt, sodass dies keinen Unterschied machen sollte.Die Verwendung von NQ ist natürlich vorzuziehen, da Sie im Bereich der stark typisierten Sprache bleiben.Wenn Sie Probleme haben, NQ dazu zu bringen, Indizes zu verwenden, können Sie Ihr Problem gerne im posten db4o-Foren und wir werden versuchen, Ihnen zu helfen.

Goran

Das Hauptproblem, auf das ich dabei gestoßen bin, ist die Berichterstellung.Es scheint einfach keine Möglichkeit zu geben, effiziente Berichte für eine DB4O-Datenquelle auszuführen.

Judah, es hört sich so an, als würden Sie keine transparente Aktivierung verwenden, was eine Funktion der neuesten Produktionsversion (7.4) ist?Vielleicht haben Sie die von Ihnen verwendete Version angegeben, da es möglicherweise andere Probleme gibt, die jetzt in der neuesten Version behoben sind?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top