0

我正在尝试使用 db4o 作为我的新网站的后端。

按照我的想法,我已经进行了设置,并插入了大约 5k 条记录(只有一种对象类型,大约有 7 个原始字段)。

根据我读过的一些博客文章,我已将属性设置为非自动属性,并尝试在公共属性公开的私有成员上设置索引。

查询性能真的很差,应该是一个简单的索引查找最多需要 3/4 秒。

我的实现如下:我的“服务器”是一个静态单例,每个应用程序实例只打开一次。

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 回答