使用PHPCR / Jackalope Doctrine DBAL的不正确查询数量?

时间:2014-08-24 14:01:00

标签: symfony doctrine-orm symfony-cmf doctrine-phpcr

我刚开始用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

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

$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()];

如何降低查询次数?

1 个答案:

答案 0 :(得分:0)

这里有几点需要考虑:

  1. 节点元数据非常可缓存,因此我建议您启用元数据缓存
  2. 对于节点,还有缓存,但是当完成任何节点写入时,整个缓存都会失效,根据应用程序可能有意义,也可能没有意义
  3. 我们目前正致力于通过PHPCR ODM和Jackalope Doctrine DBAL中的读取节点改进某些方面
  4. 在某些情况下,增加获取深度可能是有意义的(在PHPCR ODM中,对于子集合,您也可以定义一个获取深度),这将自动读取指定深度的子节点,这可以大大减少查询。
  5. 最后,所有查询(当通过路径或uuid遍历节点时)都是没有连接的PK查找,因此它们往往非常快(例如读取包含所有非结构化数据的单个节点,除了二进制文件,没有连接需要)
  6. 话虽如此,我们确实期望Jackalope Doctrine DBAL在性能方面仍有改进空间,但到目前为止,我们主要关注的是增加新功能。但是例如cmf.symfony.com在没有任何反向代理的SQLite上运行,但使用Jackalope Doctrine DBAL支持的元数据和节点缓存,并提供了相当可接受的性能。