0

我刚刚开始使用 Doctrine 和 Jackalope DBAL 实现来学习 PHPCR。

使用 Symfony 2 调试工具栏,我可以看到,对于一个简单的表单和父属性选择,它需要 15 个查询(...为了便于阅读而添加):

[2014-08-24 15:55:48] doctrine.DEBUG: SELECT ... FROM phpcr_workspaces ...
[2014-08-24 15:55:48] doctrine.DEBUG: SELECT ... FROM phpcr_namespaces
[2014-08-24 15:55:48] doctrine.DEBUG: SELECT ... FROM phpcr_type_nodes
[2014-08-24 15:55:48] doctrine.DEBUG: SELECT ... FROM phpcr_type_props ...
[2014-08-24 15:55:48] doctrine.DEBUG: SELECT ... FROM phpcr_type_childs ...
[2014-08-24 15:55:48] doctrine.DEBUG: SELECT ... FROM phpcr_type_nodes ...
[2014-08-24 15:55:48] doctrine.DEBUG: SELECT ... FROM phpcr_type_props ...
[2014-08-24 15:55:48] doctrine.DEBUG: SELECT ... FROM phpcr_type_childs ...
[2014-08-24 15:55:48] doctrine.DEBUG: SELECT ... FROM phpcr_nodes ...
[2014-08-24 15:55:48] doctrine.DEBUG: SELECT ... FROM phpcr_nodes ...
[2014-08-24 15:55:48] doctrine.DEBUG: SELECT ... FROM phpcr_nodes ...
[2014-08-24 15:55:48] doctrine.DEBUG: SELECT ... FROM phpcr_nodes ...
[2014-08-24 15:55:48] doctrine.DEBUG: SELECT ... FROM phpcr_nodes ...
[2014-08-24 15:55:48] doctrine.DEBUG: SELECT ... FROM phpcr_nodes ...
[2014-08-24 15:55:48] doctrine.DEBUG: SELECT ... FROM phpcr_nodes ...

我只有三个节点:

/
/root
/root/child

我添加了一个简单的表单(如此处所述来创建一个新文档并设置其父级:

$form = $this->createFormBuilder($doc = new Document(), ['required' => false])
    ->add('name', 'text')
    ->add('title', 'text')
    ->add('parent', 'phpcr_document', [
        'property' => 'id',
        'class'    => 'Acme\DemoBundle\Document\Document',
        'multiple' => false,
    ])
    ->add('content', 'textarea')
    ->add('submit', 'submit')
    ->getForm()
    ->handleRequest($request);

if ($form->isValid()) {
    // ...
}

return [('form' => $form->createView()];

如何减少查询次数?

4

1 回答 1

0

这里有几件事需要考虑:

  1. 节点元数据非常可缓存,因此我建议您启用元数据的缓存
  2. 对于节点,也有缓存,但是当任何节点写入完成时,整个缓存都会失效,这可能有意义,也可能没有意义,具体取决于应用程序
  3. 我们目前正在努力改进 PHPCR ODM 和 Jackalope Doctrine DBAL 中读取节点的某些方面
  4. 在某些情况下,增加获取深度可能是有意义的(在 PHPCR ODM 中,您还可以为子集合定义获取深度),这将自动读取子集合到指定的深度,这可以显着减少查询
  5. 最后,所有查询(当通过路径或 uuid 遍历节点时)都是没有连接的 PK 查找,因此它们往往非常快(例如,读取包括其所有非结构化数据的单个节点,除了二进制文件,不需要连接)

话虽如此,我们确实希望 Jackalope Doctrine DBAL 的性能仍有改进的空间,但到目前为止,我们主要专注于添加新功能。但是例如 cmf.symfony.com 在 SQLite 上运行,没有任何反向代理,而是使用 Jackalope Doctrine DBAL 支持的元数据和节点缓存,并提供了相当可接受的性能。

于 2014-08-24T17:07:36.970 回答