32

我目前正在试用 db4o(java 版本),我非常喜欢我所看到的。但我不禁想知道它在真实的现场(网络)环境中的表现如何。有没有人有任何关于运行 db4o 的经验(好的或坏的)可以分享?

4

4 回答 4

56

我们在一个大型客户端/服务器项目中运行 DB40 .NET 版本。

我们的经验是,您可以获得比典型关系数据库更好的性能。

但是,您确实必须调整对象才能获得这种性能。例如,如果您有一个包含很多对象的列表,那么 DB4O 激活这些列表的速度很慢。有很多方法可以解决这个问题,例如,通过反转关系。

另一个痛苦是激活。当您从 DB4O 检索或删除对象时,默认情况下它将激活整个对象树。例如,加载 Foo 将加载 Foo.Bar.Baz.Bat 等,直到没有任何东西可以加载。虽然从编程的角度来看这很好,但性能会减慢对象中的更多嵌套。为了提高性能,您可以告诉 DB4O 要激活多少级别。如果您有很多对象,这样做会很耗时。

另一个痛苦的领域是文本搜索。DB4O 的文本搜索远远慢于 SQL 全文索引。(他们会在他们的网站上直接告诉您。)好消息是,在 DB4O 之上设置文本搜索引擎很容易。在我们的项目中,我们连接了 Lucene.NET 来索引我们想要的文本字段。

某些 API 似乎不起作用,例如在应用数据库升级时有用的 GetField API。(例如,您重命名了一个属性,并且想要升级数据库中的现有对象,您需要使用这些“反射”API 来查找数据库中的对象。其他 API,例如 [Index] 属性不要' t 在稳定的 6.4 版本中工作,您必须改为使用非强类型的 Configure().Index("someField") 指定索引。

我们目睹了您的数据库越大,性能就会下降。我们现在有一个 1GB 的数据库,而且速度仍然很快,但不如我们开始使用小型数据库时快。

我们发现了另一个问题,如果数据库中不再存在 ID,则 Db4O.GetByID 将关闭数据库。

我们发现 Native Query 语法(最自然的、语言集成的查询语法)比不太友好的 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 个错误,还有一个以半途而废的方式进行了修补。)

如果这一切还没有让您感到害怕,那么让我说我们对 DB4O 非常满意,尽管我们遇到了一些问题。我们所获得的性能已经让我们尝试过的一些 O/RM 框架大吃一惊。我推荐它。

2015 年 7 月更新请记住,这个答案是在 2008 年写的。虽然我很欣赏这些赞成票,但从那时起世界已经发生了变化,而且这些信息可能不像它写成时那样可靠。

于 2008-08-23T19:03:18.913 回答
3

大多数本机查询可以并且在幕后有效地转换为 SODA 查询,因此不会产生影响。使用 NQ 当然是首选,因为您仍处于强类型语言领域。如果您在让 NQ 使用索引时遇到问题,请随时将您的问题发布到db4o 论坛,我们会尽力帮助您。

戈兰

于 2008-09-28T10:10:36.203 回答
2

我遇到的主要问题是报告。似乎没有任何方法可以针对 db4o 数据源运行有效的报告。

于 2008-09-18T01:12:16.523 回答
0

犹大,听起来你没有使用透明激活,这是最新生产版本(7.4)的一个功能?也许如果您指定了您正在使用的版本,因为可能有其他问题现在在最新版本中得到解决?

于 2008-10-05T12:31:48.980 回答