2012-04-07 13 views
6

Ich habe ein Repository, in dem ich versuche, Ergebnis-Caching einzurichten. Ich konnte nur ein einziges Beispiel online finden, um dies zu tun ... aber wenn ich das Beispiel in einem meiner Repositories implementiere, erhalte ich einen Fehler. Ich verwende APC für mein Caching und habe das Query-Caching aktiviert, um APC in meiner config.yml-Datei zu verwenden. Ich habe 512M zu APC zugewiesen und seine nur 50M gerade verwenden (23M dieser ist für diesen einzigen Eintrag fehlgeschlagen Cache)Wie kann ich die Abfrageergebnis-Zwischenspeicherung in einem Symfony2-Repository angeben?

Hier ist das Repository Code ich habe:

class AchievementRepository extends EntityRepository 
{ 
    function findAchievementsByCategory($categoryObj) 
    { 
     $em=$this->getEntityManager()->createQuery("SELECT a FROM FTWGuildBundle:Achievement a where a.category=:category order by a.title") 
      ->setParameter('category',$categoryObj); 
     $em->useResultCache(true,3600,'findAchievementsByCategory'); 
     $result=$em->getResult(); 
     return $result; 
    } 
} 

Und wenn diese ausgeführt wird, erhalte ich der folgende Fehler

Notice: apc_store() [<a href='function.apc-store'>function.apc-store</a>]: &quot;type&quot; returned as member variable from __sleep() but does not exist in /data/www/ftw2/Symfony/vendor/doctrine-common/lib/Doctrine/Common/Cache/ApcCache.php line 80 

Als ich in meiner apc.php Datei, um zu sehen, was zwischengespeichert ist, ich meinen Cache-Eintrag in dem Benutzer-Cache-Abschnitt mit einem gespeicherten Wert von

finden

Kann mir jemand eine Anleitung geben, wo ich falsch gelaufen bin?

Es gibt ein paar Spalten in dieser Entität, die ManyToOne sind, muss ich Lazy Load für diese Abfrage deaktivieren, damit dies funktioniert? Wenn das so ist, wie? EDIT: Ich eifrig Last aktiviert durch Zugabe holen = "EAGER" zu meinen ManyToOne Mapping ... keine Äpfel :(

EDIT # 2: BEANTWORTET - Arbeitsklassencode (beachten Sie, alle Eigenschaften der Objektklasse (Leistung) wurden geschützt geändert)

class AchievementRepository extends EntityRepository 
{ 
    function findAchievementsByCategory($categoryObj) 
    { 
     $em=$this->getEntityManager()->createQuery("SELECT a FROM FTWGuildBundle:Achievement a where a.category=:category order by a.title") 
      ->setParameter('category',$categoryObj); 
     $em->useResultCache(true,3600,'findAchievementsByCategory'); 
     $result=$em->getArrayResult(); 
     return $result; 
    } 
} 

Antwort

3

wenn Lehre eine Einheit speichert, speichert es die serialisierten Zustand davon. das Problem ist, private Eigenschaften (die Standard-Sichtbarkeit, wenn sie durch Lehre erzeugt) kann nicht serialisiert werden. zum Um dies zu beheben, müssen Sie Ihre Entitätseigenschaften geschützt machen.Mehr Informationen: http://doctrine-orm.readthedocs.org/en/2.0.x/reference/working-with-objects.html#merging-entities

Die andere Sache ist a know issue, die (endlich) in Doctrine Version 2.2 behoben wird, die in Symfony 2.1 sein wird. Wenn Sie aus irgendeinem Grund kein Upgrade durchführen können, besteht die einzige Möglichkeit zum Zwischenspeichern von Zuordnungen darin, getArrayResult anstelle von Entitäten zu verwenden.

+0

Danke! Ich habe aktualisiert, um geschützte Eigenschaften zu verwenden, und habe getResult() in getArrayResult() geändert, und es wird jetzt korrekt zwischengespeichert. – Chris

+0

@Chris, wie haben Sie getestet, ob das Ergebnis zwischengespeichert wurde? – cbacelar

+0

@cbacelar - ein paar Wege 1) Verwenden Sie den Abfrage-Debugger, Rendern einer Seite und sehen, wie viele und welche Abfragen ausgeführt werden. Ihre nicht zwischengespeicherten Abfragen werden hier angezeigt. Aktualisieren Sie die Seite und Sie sehen, dass die zwischengespeicherten Abfragen nicht ausgeführt werden. 2) Überprüfen Sie die Statistiken in Ihrem Cache (memcached, apc, etc), um zu sehen, ob mehr Daten oder mehr Datensätze im Cache sind. apc hat eine nette Schnittstelle, die Sie installieren können, damit Sie jede Entität im Cache anzeigen können (einschließlich Schlüssel, Wert und Statistik) – Chris