Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# db4o索引问题-不工作?表现不佳?_C#_Db4o - Fatal编程技术网

C# db4o索引问题-不工作?表现不佳?

C# db4o索引问题-不工作?表现不佳?,c#,db4o,C#,Db4o,我正在尝试使用db4o作为我的新网站的后端 我已经按照我认为合理的方式进行了设置,并插入了大约5k条记录(只有一种对象类型,大约有7个基本字段) 根据我读到的一些博客文章,我将属性设置为非自动属性,并尝试对公共属性公开的私有成员设置索引 查询性能非常差,一个简单的索引查找最多需要3/4秒 我的实施方案如下: 我的“服务器”是一个静态单例,每个应用程序实例只打开一次 Db4oFactory.Configure().ObjectClass(typeof(MyObject)).ObjectField(

我正在尝试使用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是一个字符串

我做错了什么

干杯,
Dave

我已经有一段时间没有使用db4o了,但是这里让我印象深刻的是您查询了属性并在backing字段上创建了一个索引。除非db4o能够理解这种关系(可能是这样,但我现在对此表示怀疑),否则它将恢复每个存储实例以访问属性并评估查询


你能链接到要求对索引进行这种设置的帖子吗?

我已经有一段时间没有使用db4o了,但让我印象深刻的是,你查询了属性并在backing字段上创建了一个索引。除非db4o能够理解这种关系(可能是这样,但我现在对此表示怀疑),否则它将恢复每个存储实例以访问属性并评估查询


你能链接到要求对索引进行这种设置的帖子吗?

这是一个旧API(7.4版,仍然在这里是为了兼容性)和新API(7.12版)不幸结合的例子。未使用配置,因此未创建索引

方法调用“Db4oFactory.Configure()”属于较旧的API。它仅在使用旧API创建ObjectContainer时使用:“db4ofatory.OpenServer()”。此全局配置存在一些潜在问题。所以我会避免它

现在我建议使用新的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);

这是旧API(版本7.4,仍在此处用于兼容性)和新API(版本7.12)的不幸组合。未使用配置,因此未创建索引

方法调用“Db4oFactory.Configure()”属于较旧的API。它仅在使用旧API创建ObjectContainer时使用:“db4ofatory.OpenServer()”。此全局配置存在一些潜在问题。所以我会避免它

现在我建议使用新的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);

实际上db4o LINQ实现找到了一个属性后面的字段。实际上db4o LINQ实现找到了一个属性后面的字段。您好,我听了您的建议,但我想说得太快了。我认为索引工作正常会提高性能,但我认为这只是因为我截断了数据库,一旦项目数接近几千个,查询时间就会成倍增加,这向我表明索引没有被使用。嗨,应该可以。您可以配置diagnostig侦听器。因此,您可以查看是否使用了索引:“cfg.Common.Diagnostic.AddListener(new DiagnosticToConsole())”。请注意,第一个LINQ查询需要更长的时间,因为db4o LINQ系统必须初始化等。我的示例中,索引用于查询。对于20000个简单对象,大约需要4-5毫秒。没有索引大约300毫秒。无论如何,我已经上传了源代码。因此,您可以检查它是否在您的计算机上工作:要使其工作,您必须将所有对象都放在MyObject类型的db4o中,或者从MyObject中居住?您好,我听了您的建议,但我想说得太快了。我认为索引工作正常会提高性能,但我认为这只是因为我截断了数据库,一旦项目数接近几千个,查询时间就会成倍增加,这向我表明索引没有被使用。嗨,应该可以。您可以配置diagnostig侦听器。因此,您可以查看是否使用了索引:“cfg.Common.Diagnostic.AddListener(new DiagnosticToConsole())”。请注意,第一个LINQ查询需要更长的时间,因为db4o LINQ系统必须初始化等。我的示例中,索引用于查询。对于20000个简单对象,大约需要4-5毫秒。没有索引大约300毫秒。无论如何,我已经上传了源代码。因此,您可以检查它是否在您的机器上工作:要使其工作,您必须在MyObject类型的db4o中设置所有对象,或者从MyObject开始设置对象?