私は現在、db4o (Java バージョン) を試しています。しかし、実際のライブ (Web) 環境でどのように機能するのか疑問に思わずにはいられません。db4o の実行について共有できる経験 (良いことも悪いことも) がある人はいますか?
4 に答える
大規模なクライアント/サーバー プロジェクトで DB40 .NET バージョンを実行しています。
私たちの経験では、一般的なリレーショナル データベースよりもはるかに優れたパフォーマンスが得られる可能性があります。
ただし、この種のパフォーマンスを得るには、実際にオブジェクトを微調整する必要があります。たとえば、多数のオブジェクトを含むリストがある場合、これらのリストの DB4O のアクティブ化は遅くなります。この問題を回避するには、関係を逆にするなど、いくつかの方法があります。
別の痛みは活性化です。DB4O からオブジェクトを取得または削除すると、デフォルトでオブジェクト ツリー全体がアクティブになります。たとえば、Foo をロードすると、ロードするものがなくなるまで Foo.Bar.Baz.Bat などがロードされます。これはプログラミングの観点からは良いことですが、オブジェクトのネストが増えるほどパフォーマンスが低下します。パフォーマンスを向上させるために、DB4O に活動化するレベルの深さを伝えることができます。たくさんのオブジェクトがある場合、これを行うには時間がかかります。
もう 1 つの問題は、テキスト検索でした。DB4O のテキスト検索は、SQL 全文索引作成よりもはるかに遅くなります。(このことは、彼らのサイトで率直に説明されています。) 幸いなことに、DB4O の上にテキスト検索エンジンをセットアップするのは簡単です。私たちのプロジェクトでは、必要なテキスト フィールドにインデックスを付けるために Lucene.NET を接続しました。
データベース アップグレードの適用に役立つ GetField API など、一部の API が機能しないようです。(たとえば、プロパティの名前を変更し、データベース内の既存のオブジェクトをアップグレードしたい場合、これらの「リフレクション」API を使用してデータベース内のオブジェクトを検索する必要があります。[Index] 属性などの他の API は使用できません。安定した 6.4 バージョンでは機能しません。代わりに、強く型付けされていない Configure().Index("someField") を使用してインデックスを指定する必要があります。
データベースが大きくなるほどパフォーマンスが低下することがわかっています。現在 1 GB のデータベースがあり、まだ高速ですが、小さなデータベースで開始したときほど高速ではありません。
ID がデータベースに存在しなくなった場合、Db4O.GetByID がデータベースを閉じるという別の問題が見つかりました。
ネイティブ クエリ構文 (最も自然で、言語に統合されたクエリの構文) は、使いにくい SODA クエリよりもはるかに遅いことがわかりました。したがって、次のように入力する代わりに:
// 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);
その優れたクエリ コードの代わりに、厳密に型指定されていない文字列ベースの醜い SODA クエリを使用する必要があります。
.NET のユーザー向けに、彼らは最近、これまでで最高の構文を提供する LINQ-to-DB4O プロバイダーを導入しました。ただし、パフォーマンスが見苦しい SODA クエリに匹敵するかどうかはまだわかりません。
DB4O のサポートはまともです。電話で何度も話し、有益な情報を受け取りました。彼らのユーザー フォーラムはほぼ無価値ですが、ほとんどすべての質問に回答がありません。彼らの JIRA バグ トラッカーは多くの注目を集めているため、しつこいバグがある場合は、JIRA にファイルすると修正されることがよくあります。(修正されたバグが 2 つあり、中途半端な方法でパッチが適用されたバグがもう 1 つありました。)
これらすべてに不安を感じていないのであれば、問題が発生したにもかかわらず、DB4O に非常に満足していると言わせてください。私たちが得たパフォーマンスは、私たちが試したいくつかの O/RM フレームワークを吹き飛ばしました。私はそれをお勧めします。
2015 年 7 月の更新この回答は 2008 年に書き戻されたことを覚えておいてください。賛成票には感謝していますが、それ以来世界は変化しており、この情報は書かれたときほど信頼できないかもしれません。
ほとんどのネイティブクエリは、舞台裏でSODAクエリに効率的に変換できるため、違いはありません。もちろん、強い型付けされた言語の領域にとどまるため、NQを使用することをお勧めします。NQでインデックスを使用する際に問題が発生した場合は、 db4oフォーラムに問題を投稿してください。サポートさせていただきます。
ゴラン
私が遭遇した主な問題は、レポートです。db4o データ ソースに対して効率的なレポートを実行する方法はないようです。
ユダさん、最新の製品バージョン (7.4) の機能である透過的なアクティベーションを使用していないようですね? おそらく、使用しているバージョンを指定した場合、最新バージョンで解決された他の問題がある可能性がありますか?