在我们的项目中,我们使用 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);
}