2012-02-28 54 views
3

我正在寻找缓存以及如何在Doctrine中使用它。Zend Framework - Doctrine2 - 知识库查询缓存

我有我的Zend框架的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'); 

而且我不确定如果我正确使用缓存,因为使用它(如上面配置中的 ),查询似乎需要两倍的时间才能执行 ,因为它被禁用,是吗?

由于提前, 史蒂夫

回答

4

我似乎已经整理这个自己,那种有关enter link description here。基本上,从我所了解的存储库查询如下:

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

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

实现这一目标的唯一途径,是覆盖在自定义库中的教义EntityRepository找到()方法是这样的:

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); - 这通知应用程序缓存结果。

希望这会有所帮助。