2013-07-08 38 views
0

我使用db4o作为看起来像语义wiki的项目的后端。 我的主要担忧是为什么表演如此之低?简单图形激活的低延迟

这里是上下文:

的应用程序中使用openJdk6 &的db4o-V8.1。该模型是在四个层次的传承约20个类,有激活的藏品,参考,UUID,指数等

使用,我发现SYS-时间日志的时间是在部分花...对象的操纵。对于30次激活或更新,应用程序平均需要1.1秒(在提交时数据少于1Kb)。我已经检查了内存(转储),从透明激活中可以看出,图中的一小部分是负载(我的数据库大约是20K对象和20Mb)。我几乎从不使用querys,总是关系激活。

我在同一主机上使用客户端服务器。 db-server就是我们可以在db4o网站上找到的例子。客户端 - 服务器杀死了一些性能,但对于并发性来说是必需的。主机依靠一个可以启用300个左右的fc存储。

  • 可以做些什么来提高性能,减少延迟?
  • 我错过了什么吗?
  • 有什么窍门我应该知道?

回答

0

如果你按照手册,那么问题来自你的数据模型 或使用它的使用。 如果您已经对使用情况进行了所有可能的优化,最后的方法 是数据模型的更重要的因素;如果你没有...现在就做。

所以简短的回答:不使用继承,保持关系链尽可能短。

较长的答案:

  • 活力花费很多。类继承为激活时的方法解析和对象解析添加动态。

在hibernate/sql like db;继承可以看作表连接,加载一个对象意味着将多行加载到一个表格中作为继承级别。所以速度受限于联接requiere(和联接条件)。

在db4o中,当您导航抛出一个对象时,决定使用对象的所有字段在用户级别部分完成;所以所有的对象指针都是加载的情况下激活一个字段。因此,对象模型的所有部分都必须从数据库加载(对于激活的对象)。这与hibernate/sql db中发生的事情非常相似。

  • 为了避免扫描到模型的玉米粥份,并加载到玉米粥激活指针,我们可以重写模型一点。 只需删除每个继承关系,并将其替换为指向相应对象的字段即可。

如果A扩展B,然后在B中添加一个指向A的字段并删除扩展关系。然后根据需要使用透明激活从A导航到B.这个技巧在很多领域,数据库中都是有效的。这是因为在复杂的图形关系中,我们很少在一次计算中使用对象的所有字段。

  • ,以提高性能的另一种解决方案是使用更短的启动路径,来实现这一点,你需要在你的模型和计算的巨大变化;一种方法是使用快速原生查询,而不仅仅是透明激活。

对于在对象数据库中查看性能的良好夜晚,您还可以查看objectDB。有和db4o相同的问题。