Symfony2和Doctrine2没有缓存连接实体的结果

18
我正在使用Symfony 2.0.10与Doctrine 2.1,有一个相当简单的查询(如下所示),我想通过useResultCache(true, 600)缓存APC的结果(版本为3.1.7,为其启用了1GB内存),并保持水化模式为\Doctrine\ORM\Query::HYDRATE_OBJECT
问题是多对多关系(Doctrine\ORM\PersistentCollection)不会被缓存,每次主查询结果被缓存时,连接的实体都被设置为null。 当我将水化模式设置为\Doctrine\ORM\Query::HYDRATE_ARRAY时,同样的查询在APC中可以很好地被缓存,但这对我来说不可接受的解决方案,因为我无法针对此重新制作许多模板。
请建议如何在APC中缓存所有连接实体的属性? 请不要指向文档,因为我认为我已经背得滚瓜烂熟,尝试解决此问题:)

CODE:

$property = $em
->createQueryBuilder()
->select('p,u')
->from('MyBundle:Property', 'p')
->leftJoin('p.users', 'u')
->where('p.id in (:id)')
->setParameter('id', 123)
->getQuery()
->useResultCache(true, 60)
->setHydrationMode(\Doctrine\ORM\Query::HYDRATE_OBJECT)
->getResult();

User.php

class User {
    /**
     * @ORM\ManyToMany(targetEntity="Property", mappedBy="users", cascade={"all"}, fetch="EAGER")
     */
     protected $properties;
}

Property.php

class Property {
    /**
     * @ORM\ManyToMany(targetEntity="User", inversedBy="properties", cascade={"all"}, fetch="EAGER")
     * @ORM\JoinTable(name="user_property",
     *      joinColumns={@ORM\JoinColumn(name="property_id", referencedColumnName="id")},
     *      inverseJoinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")}
     * )
     */
     protected $users;
}

1
APC是否有足够的空闲内存来缓存您的对象? - meze
你能检查一下这个在2.2版本中是否可用吗?它今天已经发布了,对缓存机制进行了一些修复。 - Ocramius
@Ocramius:非常感谢您的回答!根据Doctrine 2.2的更新日志,我的问题已经得到解决,但我应该等待Symfony发布支持Doctrine 2.2的版本,以便正确修改配置。 - Anton Babenko
只是交换子模块的引用来尝试一下可能会起作用(显然不适用于生产环境...尝试后应该重置更改)。DoctrineBundle肯定需要进行一些重构... - Ocramius
1
@AntonBabenko 不,显然这就是我一直在等待的答案 :) - Florian Klein
显示剩余4条评论
1个回答

4

正如@Ocramius在评论中所说,这个问题已经在Doctrine 2.2中得到解决,但我正在等待更新的DoctrineBundle,以便在我的Symfony2项目中验证。感谢您的答案和时间! - Anton Babenko
有人开始了一个悬赏,要求提供官方来源的参考资料... 我仍在等待我的声望。 - Yves Martin
我的悬赏在你回答问题之前已经过期了。我记得有其他人在我之后提供了相同的悬赏。我现在接受你的答案。 - Anton Babenko
我遇到了与一个问题完全相同的问题,只是我使用的是Memcache而不是APC。使用Symfony 2.3和Doctrine 2.2。 - Karmalakas
链接已经失效。有什么解决方法吗?我在2.3.3中好像无法实现这个,因为Doctrine似乎没有使用自己的find%方法,这会阻止我简单地重载一个repo方法以强制缓存。 - ficuscr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接