2012-04-07 14 views
6

Mam repozytorium, w którym próbuję skonfigurować buforowanie wyników. Byłem w stanie znaleźć tylko jeden przykład w Internecie, jak to zrobić ... ale kiedy implementuję przykład w jednym z moich repozytoriów, pojawia się błąd. Używam APC do mojego buforowania i włączam buforowanie zapytań, aby używać APC w moim pliku config.yml. Mam przyznane 512M do APC i jej tylko przy użyciu 50M obecnie (23M tego jest dla tego jednego nieudanego wejścia cache)Jak określić buforowanie wyników zapytania w repozytorium symfony2?

Oto kod repozytorium mam:

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; 
    } 
} 

A kiedy ten jest wykonywany otrzymuję następujący błąd

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 

Kiedy patrzę w moim pliku apc.php aby zobaczyć, co jest w pamięci podręcznej, znajdę wejście pośredniczące w sekcji cache użytkownik z zapamiętanej wartości

Fatal error: Nesting level too deep - recursive dependency? in /data/www/localhost/apc.php on line 1000 

Czy ktoś może wskazać mi kierunek, w którym popełniłem błąd?

Istnieje kilka kolumn w tym obiekcie, które są ManyToOne, czy muszę wyłączyć Lazy obciążenia na to zapytanie, aby to zadziałało? Jeśli tak to jak? EDIT: włączona chętny obciążenie dodając, przynieś = "EAGER" do mojego mapowania ManyToOne ... bez jabłka :(

EDIT # 2: ODPOWIADAJĄCY - Working kodu klasy (uwaga, wszystkie właściwości klasy podmiotu (osiągnięcie) zostały zmienione w celu chroniony)

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; 
    } 
} 

Odpowiedz

3

gdy Doctrine buforuje podmiot, to zapisuje zserializowaną stan niego. problem polega na tym, właściwości prywatne (domyślną widoczność kiedy wygenerowany przez Doctrine) nie mogą być serializowane. aby Napraw to, musisz chronić właściwości swojej jednostki. Więcej informacji: http://doctrine-orm.readthedocs.org/en/2.0.x/reference/working-with-objects.html#merging-entities

Inną rzeczą jest a know issue, która jest (ostatecznie) poprawiona w Doctrine wersji 2.2, która będzie w Symfony 2.1. Jeśli nie możesz dokonać aktualizacji z jakiegoś powodu, jedynym sposobem na zbuforowanie skojarzeń jest użycie getArrayResult zamiast zapełniania encji.

+0

Dzięki! Zaktualizowałem, aby używać właściwości chronionych i zmieniłem metodę getResult() na getArrayResult(), a teraz poprawnie buforuje. – Chris

+0

@Chris, jak przetestowałeś, czy wynik został zbuforowany? – cbacelar

+0

@ cbacelar - kilka sposobów 1) Użyj debugera zapytań, wyrenderuj stronę i zobacz, ile i które zapytania są uruchamiane. Zobaczysz tutaj swoje niezaskakujące zapytania. Odśwież stronę, a zobaczysz, że zapytania w pamięci podręcznej nie są wykonywane. 2) Sprawdź statystyki w pamięci podręcznej (memcached, apc, itp.), Aby zobaczyć, czy więcej danych lub więcej zapisów w pamięci podręcznej. apc ma ładny interfejs, który można zainstalować, aby umożliwić przeglądanie każdej jednostki w pamięci podręcznej (w tym klucz, wartość i statystyki) – Chris

Powiązane problemy