我正在使用db4o作为一个看起来像语义维基的项目的后端。 我主要担心的是为什么表演如此之低?
以下是上下文:
该应用程序使用openJdk6& db4o的-V8.1。该模型大约有二十个级别,分为四个级别的继承,有可激活的集合,引用,uuid,索引等......
通过使用sys-time日志,我发现在操作对象时花费的时间。对于30次激活或更新,应用程序平均需要1.1s(在提交时少于1Kb的数据)。我已经检查了内存(转储),只是图中的一小部分是加载(我的数据库大约是20K对象和20Mb),如预期的透明激活。我几乎从不使用查询,总是关系激活。
我在同一台主机上使用客户端服务器。 db-server是我们可以在db4o网站上找到的示例。客户端 - 服务器会扼杀一些性能,但要求并发性。主机依靠fc存储来启用大约300iops。
答案 0 :(得分:0)
如果您按照手册操作,则问题来自您的数据模型 或使用它。 如果你已经完成了所有可能的优化使用,那么最后一种方式 是数据模型的重新分解;如果你没有......现在就去做。
简而言之:不使用继承,保持关系链尽可能短。
更长的答案:
在像db这样的hibernate / sql中;继承可以看作是表上的连接,加载一个对象意味着在一个表格中加载多行作为继承级别。因此,加速要求(和连接条件)限制了速度。
在导航抛出对象时,在db4o中,决定使用对象的所有字段是在用户级别部分完成的;因此所有对象指针都是加载的,是激活字段的情况。因此,必须从数据库(对于激活的对象)加载对象模型的所有部分。这与hibernate / sql db中发生的情况非常相似。
如果A扩展B,则在B中添加指向A的字段并删除扩展关系。然后根据需要使用透明激活从A导航到B.这个技巧在许多领域,数据库或非数据库都是有效的。它起作用,因为在复杂的图形关系中,我们很少在一次计算中使用对象的所有字段。
为了在对象数据库中阅读有关性能的晚安,您还可以查看objectDB。存在与db4o中相同的问题。