Zend Framework - Doctrine2 - Кэширование запросов к репозиторию - PullRequest
3 голосов
/ 28 февраля 2012

Я смотрю на Caching и как его использовать в 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 Ответ

4 голосов
/ 29 февраля 2012

Я, кажется, сам отсортировал это, вроде как связано с введите описание ссылки здесь . По сути, из того, что я понимаю, запрос к хранилищу:

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

Не будет кешировать результаты. Если один и тот же запрос будет выполнен снова во время обработки скрипта, он не будет выполнять поиск и использовать результат, который он имеет в памяти - это не то же самое, что реальное кэширование, в моем случае с использованием Memcache.

Единственный способ добиться этого - переопределить метод find () Doctrine 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); - это сообщает Приложению о необходимости кэшировать результаты.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...