2012-02-28 17 views
3

私はキャッシングとそれをDoctrineで使用する方法を見ています。Zend Framework - Doctrine2 - リポジトリクエリキャッシング

// 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); 

私が使用して私のDBには非常に単純なクエリを実行している:

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

をそして私はありません

私はZend Frameworkのbootstrap.phpの中で、以下の持っていますキャッシュを正しく使用しているかどうか確かめてください(上の設定で として)クエリは実行するのに2倍の時間がかかるようです 無効にすると、これは正しいのですか?事前に

おかげで、 スティーブ

答えて

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);ある - この知らせます結果をキャッシュするためのアプリケーション。

これが役に立ちます。