Zend Framework - Doctrine2 - 存储库查询缓存

时间:2012-02-28 11:38:42

标签: doctrine-orm

我正在研究缓存以及如何在Doctrine中使用它。

我的Zend Framework Bootstrap.php中有以下内容:

// Build Configuration
$orm_config = new \Doctrine\ORM\Configuration();

// Caching
$cacheOptions = $options['cache']['backendOptions'];
$cache = new \Doctrine\Common\Cache\MemcacheCache();
$memcache = new Memcache;
$memcache->connect($cacheOptions['servers']['host'], $cacheOptions['servers']['port']);
$cache->setMemcache($memcache);
$orm_config->setMetadataCacheImpl($cache);
$orm_config->setQueryCacheImpl($cache);
$orm_config->setResultCacheImpl($cache);

我正在使用以下命令在我的数据库上运行一个非常简单的查询:

self::_instance()->_em->getRepository('UserManagement\Users')->find('1');

而且我不确定我是否正确使用缓存,因为有了它(如 根据上面的配置,查询似乎需要两倍的执行时间 和它一样禁用,这是对的吗?

提前致谢, 史蒂夫

1 个答案:

答案 0 :(得分:4)

我似乎自己对此进行了排序,与enter link description here有关。基本上,据我所知,存储库查询如:

self::_instance()->_em->getRepository('UserManagement\Users')->find('1');

不会缓存结果。如果在整个脚本处理过程中再次执行相同的查询,它将不执行搜索并使用它在内存中的结果 - 这与真正的缓存不同,在我的情况下使用Memcache。

实现此目的的唯一方法是使用以下内容覆盖自定义存储库中的Doctrine EntityRepository find()方法:

public function find($id)
{
    // Retrieve an instance of the Entity Manager
    $qb = $this->getEntityManager()->createQueryBuilder();

    $qb->select('u')
       ->from('UserManagement\Users', 'u')
       ->where('u.id = :id')
       ->setParameter('id', $id);

    $query = $qb->getQuery();
    $query->useResultCache(TRUE);
    $result = $query->getSingleResult();
    return $result;
}

值得注意的是,上面最重要的一行是$query->useResultCache(TRUE); - 这会通知应用程序缓存结果。

希望这有帮助。