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>]: "type" 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;
}
}
Dzięki! Zaktualizowałem, aby używać właściwości chronionych i zmieniłem metodę getResult() na getArrayResult(), a teraz poprawnie buforuje. – Chris
@Chris, jak przetestowałeś, czy wynik został zbuforowany? – cbacelar
@ 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