2016-07-20 6 views
0

Ich habe eine Anwendung in Symfony mit mongodb, wo ich eine Anwendung immer als Server ausgeführt haben. Wenn ich versuche, Objekte aus der Datenbank abzurufen, erhalte ich die neuen Werte des Objekts nicht. Ist wie Doktrin die Objekte zwischenspeichert und obwohl es andere Prozesse gibt, die die Datenbank aktualisiert, sieht meine Anwendung die Änderungen nicht, und immer das erste Objekt, das abgerufen wird, wird zurückgegeben.Symfony Doktrin Force immer Abfrage der Datenbank

Als Test habe ich zwei Prozesse programmiert, einer schreibt Werte und der andere liest diese Werte, wie Sie sehen können, sieht der Leser immer den gleichen Wert. Diese

getter always sees a zero value

ist der Code der beiden Prozesse:

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; 

    ... 
} 

Wie kann ich Lehre in diesem Prozess zwingen, immer die Datenbank abfragen?

+1

'$ entityManager-> detach ($ object); –

+0

Das macht keinen Sinn - Sie erhalten ein Element wie dieses (immer die gleiche Abfrage)' $ element = $ em-> getRepository ('DelfosBundle: TestDoc') -> findOneById ("46e05892b50334e0badbb8cac9a076a7"); 'und ein anderes Ergebnis erwarten? – pavlovich

+0

$ entityManager-> detach ($ object) woks korrekt, aber es gibt keine Möglichkeit, es automatisch zu tun? –

Antwort

2

Verwenden Sie QueryBuilder und legen Sie den Aktualisierungshinweis auf true für die Abfrage fest, die Sie mit der Methode setRefresh() erstellen.

+0

Dies ist der Weg zu gehen. Doctrine verfügt über eine Identitätskarte, in der alle angeforderten Objekte gespeichert und schließlich als Cache verwendet werden. – romaricdrigon

+0

Ok, das funktioniert auch, aber es gibt keine Möglichkeit zu erzwingen, die Datenbank immer zu holen, anstatt es in jeder Abfrage zu tun, die ich habe? etwas wie $ em-> setRefresh (false); und von diesem Punkt aus, um zu vermeiden, dass eine Abfrage zwischengespeichert wird? –

+0

Nicht, dass ich weiß. PHP ist eine Web-Dev-Sprache, die entwickelt wurde, um Anfrage-Antwort-Anwendungsfälle nicht für lange laufende Aufgaben zu behandeln. Sie können eine lange laufende Aufgabe mit PHP erledigen, aber Sie sind wahrscheinlich besser in einer anderen Sprache. Sie könnten '$ entityManager-> clear()' am Anfang Ihrer Schleife ausprobieren. – Gustek