【问题标题】:Indecent number of queries with PHPCR/Jackalope Doctrine DBAL?使用 PHPCR/Jackalope Doctrine DBAL 的查询数量不合理?
【发布时间】:2014-08-24 14:01:00
【问题描述】:

我刚刚开始学习 PHPCR 与 Doctrine 和 Jackalope DBAL 实现。

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

如何减少查询次数?

【问题讨论】:

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


    【解决方案1】:

    这里有几件事需要考虑:

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

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

    【讨论】:

      猜你喜欢
      • 2015-11-09
      • 1970-01-01
      • 1970-01-01
      • 2016-04-18
      • 2015-06-04
      • 2011-07-15
      • 1970-01-01
      • 2011-10-07
      • 1970-01-01
      相关资源
      最近更新 更多