我目前正在试用db4o ( java版),我非常喜欢我所看到的。但我不禁想知道它在真实的(网络)环境中的表现如何。有没有人有什么运行db4o的经验(好的或者不好的)来分享?
发布于 2008-08-23 19:03:19
我们在一个大型客户端/服务器项目中运行DB40 .NET版本。
我们的经验是,与典型的关系数据库相比,您可以获得更好的性能。
然而,你真的需要调整你的对象来获得这种性能。例如,如果您有一个包含大量对象的列表,则这些列表的DB4O激活速度会很慢。有许多方法可以绕过这个问题,例如,通过颠倒关系。
另一个痛苦是激活。从DB4O检索或删除对象时,默认情况下将激活整个对象树。例如,加载Foo将加载Foo.Bar.Baz.Bat,等等,直到没有剩余可加载的内容。虽然从编程的角度来看这很好,但在对象中嵌套越多,性能就会越慢。要提高性能,您可以告诉DB4O要激活多少层。如果你有很多对象,这是很耗时的。
另一个痛苦的领域是文本搜索。DB4O的文本搜索比SQL全文索引慢得多。(他们会在他们的网站上直接告诉你。)好消息是,在DB4O上设置文本搜索引擎很容易。在我们的项目中,我们连接了Lucene.NET来索引我们想要的文本字段。
有些API似乎不起作用,例如在应用数据库升级时有用的GetField API。(例如,您已经重命名了一个属性,并且想要升级数据库中的现有对象,则需要使用这些“反射”API来查找数据库中的对象。其他.Index,比如Index属性,在稳定的6.4版本中不起作用,您必须使用Configure()API(“someField”)来指定索引,该API不是强类型的。
我们已经看到,数据库越大,性能就越差。我们现在有一个1 1GB的数据库,速度仍然很快,但没有我们刚开始使用一个小数据库时那么快。
我们发现了另一个问题,如果该ID在数据库中不再存在,Db4O.GetByID将关闭数据库。
我们发现原生查询语法(最自然的、语言集成的查询语法)比不太友好的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人员来说,他们最近引入了一个LINQtoDB4O提供程序,它提供了迄今为止最好的语法。然而,性能是否会达到丑陋的SODA查询还有待观察。
DB4O的支持一直很好:我们已经和他们通了几次电话,并收到了有用的信息。他们的用户论坛几乎一文不值,然而,几乎所有的问题都没有答案。他们的JIRA bug追踪器受到了很多关注,所以如果你有一个纠缠不休的bug,把它归档到JIRA上就会得到修复。(我们已经修复了两个bug,另一个已经以半成功的方式完成了修补。)
如果所有这些都没有吓跑你,让我说我们对DB4O非常满意,尽管我们遇到了很多问题。我们所获得的性能让我们尝试过的一些O/RM框架大吃一惊。我推荐它。
更新2015年7月请记住,这个答案是在2008年写的。虽然我很感谢大家的好评,但从那时起,世界已经发生了变化,这些信息可能不像写它时那么可靠了。
发布于 2008-09-28 10:10:36
大多数原生查询可以在幕后有效地转换为SODA查询,因此这不会有什么不同。使用NQ当然是首选,因为您仍然停留在强类型语言的领域中。如果您在让NQ使用索引时遇到问题,请随时将您的问题发布到db4o forums,我们将尽力帮助您解决问题。
Goran
发布于 2008-09-18 01:12:17
我遇到的主要问题是报告。似乎没有任何方法可以针对db4o数据源运行有效的报告。
https://stackoverflow.com/questions/21207
复制相似问题