如何在使用带有大量对象的symfony 2 ACL系统时获得良好的性能


How to get good performances when using symfony 2 ACL system with a large number of object?

在我们的项目中,我们使用symfony 2 ACL系统来控制对存储在数据库(Postgresql)中的实体的访问。

在我们想要检查大量对象(几百个)的权限之前,一切都很好。然后表现越来越糟糕。在某些页面上,对数据库的查询数量超过4000。事实上,这个数字与我们数据库中的实体数量直接相关。它增长得越多,就需要对此页面进行更多的查询。

有没有一种方法可以检查用户对多个对象的授权,同时保持下降性能(保持数据库的查询数量较低)?

有一种方法可以实际加载与一个或多个不同实体相关的acl数据。系统尝试在少量查询中加载所有数据,然后保留数据,以便在不再次访问数据库的情况下重用这些数据。

private function loadBlogPostsAcls($blogPostRepository)
{
    $oids = array();
    foreach ($blogPostRepository->findBy(array(), array('date' => 'asc')) as $blogPost) {
        $oids[] = ObjectIdentity::fromDomainObject($blogPost);
    }
    $this->aclProvider->findAcls($oids);
}