【发布时间】:2012-06-13 08:04:58
【问题描述】:
我在使用 HYDRATE_OBJECT 时遇到了 Doctrine 2 的性能问题。当我从HYDRATE_ARRAY 切换到HYDRATE_OBJECT 时,耗时将近10 倍!我使用doctrine 2 and zend paginator 作为参考:
$query = $em->createQuery($dql)
->setHydrationMode(\Doctrine\ORM\AbstractQuery::HYDRATE_ARRAY)
->setParameter('x', 1);
// Pagination
$paginator = new Doctrine\ORM\Tools\Pagination\Paginator($query, false);
$iterator = $paginator->getIterator();
die(); // 160 ms
对
$query = $em->createQuery($dql)
->setHydrationMode(\Doctrine\ORM\AbstractQuery::HYDRATE_OBJECT)
->setParameter('x', 1);
// Pagination
$paginator = new Doctrine\ORM\Tools\Pagination\Paginator($query, false);
$iterator = $paginator->getIterator();
die(); // 1.4s
我应该注意什么?如何减少处理时间并仍然使用HYDRATE_OBJECT?有没有更好的方法来完成分页?
*编辑:使用->setFirstResult($itemsPerPage * $page - $itemPerPage)->setMaxResults($itemsPerPage); 会显着减少加载时间,但使用$iterator 时:
$adapter = new \Zend_Paginator_Adapter_Iterator($iterator);
$zend_paginator = new \Zend_Paginator($adapter);
$zend_paginator->setItemCountPerPage($itemsPerPage)
->setCurrentPageNumber($page);
Zend 只知道$itemsPerPage, (count($iterator) == $itemsPerPage),因此分页链接总是只计算 1 页。如何使用 Zend_Paginator 完成正确的分页,并且只加载 $itemsPerPageentities?
【问题讨论】:
-
你分析过你的代码吗?如果不知道您的模型中有什么样的业务逻辑,就很难回答这个问题。
-
除了 ArrayCollection 的 ->add() 之外,实体中没有业务逻辑。 Rest 是普通的 setter 和 getter。
-
使用 OneToMany 连接时 setMaxResults 不是问题吗?
标签: php performance doctrine-orm