2012-02-28 2 views
3

Я ищу Кэширование и как его использовать в Доктрине.Zend Framework - Doctrine2 - Кэширование запросов хранилища

У меня есть следующий в моем 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'); 

И я не конечно, если я правильно использую кеширование, потому что с ним (как в приведенной выше конфигурации), запрос, похоже, занимает в два раза больше времени для выполнения , так как с ним отключено, это правильно?

Спасибо заранее, Стив

ответ

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); - это сообщает приложение для кэширования результатов.

Надеюсь, это поможет.

Смежные вопросы