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

===============>>#1 票数: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年写回来的。虽然我很欣赏这些赞成,但自那时起世界发生了变化,而且这些信息可能不像编写时那样可靠。

===============>>#2 票数:3

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

戈兰

===============>>#3 票数:2

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

===============>>#4 票数:0

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

  ask by mafro translate from so

未解决问题?本站智能推荐:

1回复

从db4o到db4o复制的复制不完全

我无法使复制在两个db4o数据库之间完全起作用。 我遵循了许多教程,并且我的代码似乎与它们相当(显然不是)。 输出表明ReplicationSession正在检测更改,但未在其他数据库中复制更改。 这是我每8秒从一个计时器运行一次的实际同步 对于创建并写入数据库的新对象而言,
1回复

db4o和替代品

我有一个Java应用程序,需要处理10到100千兆字节的数据。 任何DBMS都需要嵌入。 当前,我们有一个db4o解决方案,它速度慢,脆弱且复杂。 我将允许我们很多伤口都是自残的。 我们假设当前的db4o实现是不可挽救的。 人们会建议继续使用db4o(并且在使用时要更加小心)吗?
1回复

db4o Java 8兼容吗?

具有使用db4o的辅助项目。 它不适用于JVM 8(在反序列化时, Caused by: java.lang.IllegalArgumentException: Can not set java.lang.Long field com.xxx.yyy.version to com.db4o.r
1回复

DB4o HashMap toString()

作为DB4o和Java的学习工具,我已经开始创建电话簿。 为此,我创建了一个TelephoneDirectory的实例,其中包含一年和条目的HashMap。 所以我用addEntry添加了一些条目。 我想要做的是在电话簿中搜索特定名称。 为此,我使用QueryByExample(Q
2回复

Maven和db4o依赖

我很想测试Java世界中的新框架,并决定创建一个利用Maven和db4o的新项目。 我开始对Maven感兴趣,但我很难将db4o作为项目的依赖项添加。 第一个问题是官方Maven存储库中不存在db4o。 接下来是db4o似乎最近重组了整个网站的URI的问题:s,所以当我尝试浏览他们的网站时
1回复

db4o DataConnection错误

我想使用db4o,我正在youtube.com教程中学习它。 不幸的是,我无法在代码中发现错误。 我想知道为什么会出现错误? 我添加了所有重要的库。 代码重要类: 这是本教程(重要事项5:44): http : //www.youtube.com/watch?v= dcNf
3回复

db4o-DatabaseClosedException

我试图通过一个Arquillian测试用例将一个实体与db4o存储在一起,并且正在获取DatabaseClosedException: 测试集:com.walterjwhite.address.api.datastore.TestAddressDatastore 测试运行:1,失败
2回复

db4o获取特定对象android java

我正在做一个android项目,没有Java的丰富经验,所以现在可以将对象存储在db4o数据库中,我还可以将它们全部收回。 但是,如果我想获取特定项目的列表,则仅返回1个项目(即使还有更多项目)。 我将向您展示我的代码: 这是获取数据库的代码,这应该可以工作。 它是db4oHel
1回复

使用Datanucleus JDO连接到db4o

我一直在阅读datanucleus教程,甚至不了解如何连接到db4o数据库。 通常,在不使用数据核的情况下,我会这样打开连接: ObjectContainer db = Db4oEmbedded.openFile(“ myDb”); 问题很简单:我应该怎么做才能使用datanu
2回复

db4o类模型瞬态字段

我正在使用db4o作为DBMS,但我有一个问题: 有什么方法可以指定我不想在数据库中存储模型类的字段? 与关系数据库一起使用时,类似于@Transient注释吗?