db4o体验?

时间:2008-08-21 21:12:02

标签: java db4o

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

4 个答案:

答案 0 :(得分:55)

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

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

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

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

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

某些API似乎不起作用,例如GetField API在应用数据库升级时很有用。 (例如,您已重命名属性并且想要升级数据库中的现有对象,您需要使用这些“反射”API来查找数据库中的对象。其他API,例如[Index]属性不要在稳定的6.4版本中工作,你必须使用Configure()。索引(“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 bug跟踪器受到了很多关注,所以如果你有一个唠叨的bug,把它归档到JIRA就可以得到修复了。 (我们已经修复了2个错误,另一个错误修复了。)

如果这一切都没有让你害怕,那么请允许我说我们对DB4O非常满意,尽管遇到了我们遇到的问题。我们所获得的性能已经破坏了我们尝试过的一些O / RM框架。我推荐它。

2015年7月更新请记住,这个答案是在2008年写回来的。虽然我很欣赏这些内容,但自那以后世界发生了变化,这些信息可能不像以前那样可靠。它是写的。

答案 1 :(得分:3)

大多数原生查询可以并且在幕后有效地转换为SODA查询,这样就不会产生任何影响。使用NQ当然是首选,因为您仍然使用强类型语言。如果你在让NQ使用索引时遇到问题,请随时将你的问题发布到db4o forums,我们会尽力帮助你。

戈兰

答案 2 :(得分:2)

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

答案 3 :(得分:0)

Judah,听起来你没有使用透明激活,这是最新生产版本(7.4)的功能?也许您指定了正在使用的版本,因为可能存在其他问题,这些问题现在已在最新版本中解决了?