2016-07-20 4 views
0

У меня есть приложение в Symfony с mongodb, где у меня есть приложение, всегда работающее как сервер. Когда я пытаюсь извлечь объекты из базы данных, я не получаю значения в виде новостей для объекта. Похоже, что доктрина кэширует объекты, и хотя есть другие процессы, которые обновляют базу данных, мое приложение не видит изменений и всегда возвращает первый возвращенный объект.Symfony doctrine force всегда запрашивать базу данных

В качестве теста я запрограммировал два процесса, один записывает значения, а другой считывает эти значения, так как вы можете видеть, что читатель всегда видит одно и то же значение.

getter always sees a zero value

Это код двух процессов:

class SetterCommand extends ContainerAwareCommand 
{ 
    protected function configure() 
    { 
     $this 
      ->setName('delfos:setter') 
      ->setDescription('Sets value'); 
    } 

    protected function execute(InputInterface $input, OutputInterface $output){ 

     $em = $this->getContainer()->get('doctrine_mongodb')->getManager(); 
     $element = $em->getRepository('DelfosBundle:TestDoc')->findOneById("46e05892b50334e0badbb8cac9a076a7"); 
     $i = 0; 

     while(true){ 
      $element->setIndex($i); 
      $em->persist($element); 
      $em->flush(); 
      echo "Setting value to ".$i.PHP_EOL; 
      $i++; 
      sleep(2); 
     } 
    } 
} 


class GetterCommand extends ContainerAwareCommand 
{ 
    protected function configure() 
    { 
     $this 
      ->setName('delfos:getter') 
      ->setDescription('Gets value'); 
    } 

    protected function execute(InputInterface $input, OutputInterface $output){ 
     $em = $this->getContainer()->get('doctrine_mongodb')->getManager(); 

     while(true){ 
      $element = $em->getRepository('DelfosBundle:TestDoc')->findOneById("46e05892b50334e0badbb8cac9a076a7"); 
      echo "Current value ".$element->getIndex().PHP_EOL; 
      sleep(2); 
     } 
    } 
} 

/** 
* @MongoDB\Document 
*/ 
class TestDoc 
{ 

    /** 
    * @MongoDB\Id(strategy="UUID") 
    */ 
    protected $id; 

    /** 
    * @MongoDB\Int 
    */ 
    protected $index; 

    ... 
} 

Как я могу заставить доктрину в этом процессе всегда запросов к базе данных?

+1

Попробуйте отсоединить ранее запрошенный объект перед повторным выполнением запроса '$ entityManager-> detach ($ object);' –

+0

Это не имеет смысла - вы получаете такой элемент (всегда такой же запрос) '$ element = $ em-> getRepository ('DelfosBundle: TestDoc') -> findOneById ("46e05892b50334e0badbb8cac9a076a7"); 'и ожидать другого результата? – pavlovich

+0

$ entityManager-> detach ($ object) woks правильно, но нет никакого способа сделать это автоматически? –

ответ

2

Используйте QueryBuilder и задайте подсказку обновления до true по запросу, который вы создаете с помощью метода setRefresh().

+0

Это путь. У Doctrine есть идентификационная карта, где хранится все запрошенные объекты, и в конечном итоге будет использовать ее в качестве кеша. – romaricdrigon

+0

Хорошо, это тоже работает, но нет способа заставить всегда извлекать базу данных вместо того, чтобы делать это в каждом запросе, который у меня есть? что-то вроде $ em-> setRefresh (false); и с этой точки силы, чтобы избежать кэширования любого запроса? –

+0

Не то, чтобы я знал. PHP - это язык веб-разработчиков, предназначенный для обработки случаев использования запроса-ответа, а не для длительных задач. Вы можете выполнять долговременную задачу с PHP, но, вероятно, вам лучше делать это на каком-то другом языке. Вы можете попробовать '$ entityManager-> clear()' в начале вашего цикла. – Gustek

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