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