2012-11-12 11 views
6

Używam Doctrine 2.2.2, próbując wykonać zapytanie dla użytkownika wraz z firmą użytkownika. Chcę, aby to zapytanie było buforowane, ponieważ dane wewnątrz nie będą się często zmieniać, jeśli w ogóle. Poniżej jest to, co próbowałem:Pamięć podręczna wyników Doctrine nie buforuje zapytania z łączeniem

$user = $em->createQuery(' 
    SELECT u, c 
    FROM Entities\User u 
    LEFT JOIN u.company c 
    WHERE u.id = :id 
')->setParameter('id', $identity)->useResultCache(true, 21600, 'user_' . $identity)->getResult(); 

Pozornie, jednostka użytkownika jest buforowane, ale nadal robi kwerendę dla firmy. Czy istnieje sposób, w jaki mogę pobrać oba jednocześnie i umieścić je w pamięci podręcznej wyników?

Znalazłem this, ale jest bardzo stary i jego rozwiązanie nie działa dla mnie.

Zasugerowano mi, że robię this, ale tego rodzaju pokonuje cel pamięci podręcznej wyników.

+0

nie wiem doktryny, ale można dać MySQL buforuje wewnętrzny spróbować: Wybierz SQL_CACHE u, c od podmiotów \ użytkownik u LEFT JOIN u.company c GDZIE u.id =: id – nfo

+0

To nie jest pomocne. Chcę móc korzystać ze wszystkich elementów encji Doktryny. – tubaguy50035

+1

Spróbuj wymusić pobieranie EAGER (zamiast leniwego). Musisz dodać fetch = "EAGER" do definicji relacji. – Cyprian

Odpowiedz

1

Przetestowałem to z doktryną 2.3 przy użyciu:

$q->setResultCacheDriver(new \Doctrine\Common\Cache\ApcCache()) 
    ->setResultCacheLifetime(21600) 
    ->setResultCacheId('user_' . $identity); 

Gdy go pierwszy raz, widzę w moim rzeczywiste zapytanie SQL-rejestratorze.
Po uruchomieniu tego drugiego, trzeciego itd. Czasu, nie widzę niczego w moim logu sql.

Mój wniosek jest taki, że działa dobrze.

Domyślam się, że albo nie masz skonfigurowanej pamięci podręcznej wyników, albo masz skonfigurowaną tymczasową pamięć podręczną wyników (taką jak ArrayCache), albo jest to błąd w Dontrine 2.2.2 (chociaż nie mogę znaleźć coś na ten temat na jirę).

PS: wnoszę z innym pytaniem (Doctrine detaching, caching, and merging), które zostały zmodernizowane do Nauki 2.3. Czy nadal masz ten problem?

PPS: Gdzieś po Nauki 2.0 (myślę, że było 2,2), wynik-cache zmieniło. Zamiast buforowania uwodnionego wyniku, wynik sql jest buforowany (i nawadnianie odbywa się w każdym biegu). Jeśli chcesz buforować uwodniony wynik, będziesz musiał użyć pamięci podręcznej hydratacji (ale bądź pewien, że te wyniki są , a nie połączone z EntityManager).

+0

Moim rozwiązaniem było stworzenie własnej "pamięci podręcznej wyników". Na tym polega inne pytanie. – tubaguy50035

Powiązane problemy