简单图激活的低延迟

时间:2013-07-08 20:24:06

标签: database latency db4o

我正在使用db4o作为一个看起来像语义维基的项目的后端。 我主要担心的是为什么表演如此之低?

以下是上下文:

该应用程序使用openJdk6& db4o的-V8.1。该模型大约有二十个级别,分为四个级别的继承,有可激活的集合,引用,uuid,索引等......

通过使用sys-time日志,我发现在操作对象时花费的时间。对于30次激活或更新,应用程序平均需要1.1s(在提交时少于1Kb的数据)。我已经检查了内存(转储),只是图中的一小部分是加载(我的数据库大约是20K对象和20Mb),如预期的透明激活。我几乎从不使用查询,总是关系激活。

我在同一台主机上使用客户端服务器。 db-server是我们可以在db4o网站上找到的示例。客户端 - 服务器会扼杀一些性能,但要求并发性。主机依靠fc存储来启用大约300iops。

  • 可以采取哪些措施来提高性能,减少延迟?
  • 我想错过什么吗?
  • 我应该知道诀窍吗?

1 个答案:

答案 0 :(得分:0)

如果您按照手册操作,则问题来自您的数据模型 或使用它。 如果你已经完成了所有可能的优化使用,那么最后一种方式 是数据模型的重新分解;如果你没有......现在就去做。

简而言之:不使用继承,保持关系链尽可能短。

更长的答案:

  • 动态成本很高。类继承为激活时的方法分辨率和对象分辨率增添了动力。

在像db这样的hibernate / sql中;继承可以看作是表上的连接,加载一个对象意味着在一个表格中加载多行作为继承级别。因此,加速要求(和连接条件)限制了速度。

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

  • 为了避免扫描到模型的糊状部分,并加载到软件激活指针,我们可以重写模型一点。 只需删除每个继承关系,并用指向相应对象的字段替换它们。

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

  • 提高性能的另一个解决方案是使用更短的激活路径,为此,您需要对模型和计算进行大规模更改;一种方法是使用快速本机查询,而不仅仅是透明激活。

为了在对象数据库中阅读有关性能的晚安,您还可以查看objectDB。存在与db4o中相同的问题。