0

新しいWebサイトのバックエンドとしてdb4oを使用しようとしています。

私は賢明だと思ったように設定し、約5kのレコードを挿入しました(1つのオブジェクトタイプのみで、約7つのプリミティブフィールドがあります)。

私が読んだいくつかのブログ投稿によると、私はプロパティを非自動プロパティとして設定し、パブリックプロパティによって公開されているプラ​​イベートメンバーにインデックスを設定しようとしました。

クエリのパフォーマンスは非常に悪く、単純なインデックス付きルックアップには最大3/4秒かかります。

私の実装は次のとおりです。私の「サーバー」は静的シングルトンであり、アプリケーションインスタンスごとに1回だけ開かれます。

Db4oFactory.Configure().ObjectClass(typeof(MyObject)).ObjectField("_Id").Indexed(true);
server = Db4oClientServer.OpenServer("DatabseName", 0);

次に、クエリを実行します。

using (var ooDB = server.OpenClient())
{
    var movieFound = (from MyObject m in ooDB
                    where m.Id == IdToFind
                    select m).FirstOrDefault();
}

私のオブジェクトを次のように使用します。

public class MyObject
{
    protected string _Id;
    public string Id 
    { 
        get { return _Id; } 
        set { _Id = value; } 
    }
}

オブジェクトのIDは文字列です。

私は何を間違っているのですか!

乾杯、デイブ

4

2 に答える 2

3

これは、古い API (バージョン 7.4、互換性のためにまだここにある) と新しい API (バージョン 7.12) の不運な組み合わせのケースです。構成は使用されないため、インデックスは作成されません。

メソッド呼び出し「Db4oFactory.Configure()」は古い API に属します。これは、古い API である「Db4oFactory.OpenServer()」で ObjectContainer を作成する場合にのみ使用されます。このグローバル構成には潜在的な問題があります。だから私はそれを避けます。

ここで、新しい API を使用することをお勧めします。そこで、構成を明示的に渡す必要があります。また、構成インターフェースはよりクリーンです。特に、クライアント/サーバー構成が分離されています。「Db4oClientServer.NewServerConfiguration()」を使用して、新しい構成を作成します。そして、それを「Db4oClientServer.OpenServer」に渡します。したがって、あなたの場合、これは次のようになります。

        IServerConfiguration cfg = Db4oClientServer.NewServerConfiguration();
        cfg.Common.ObjectClass(typeof(MyObject)).ObjectField("_Id").Indexed(true);

        IObjectServer server = Db4oClientServer.OpenServer(cfg, "DatabseName.db4o", 0);
于 2010-02-25T13:01:11.837 に答える
0

私はしばらく db4o を使用していませんが、ここで私を驚かせたのは、プロパティをクエリし、バッキング フィールドにインデックスを作成していることです。db4o が関係を理解できない限り (可能性はあるかもしれませんが、今のところ疑問です)、保存されているすべてのインスタンスを復活させて、プロパティにアクセスし、クエリを評価します。

インデックスのこの種のセットアップを要求した投稿にリンクできますか?

于 2010-02-25T10:51:39.893 に答える