2012-11-12 44 views
6

Tôi đang sử dụng Doctrine 2.2.2 cố gắng thực hiện truy vấn cho thực thể người dùng cùng với công ty của người dùng. Tôi muốn truy vấn này được lưu trong bộ nhớ cache vì dữ liệu bên trong sẽ không thay đổi thường xuyên, nếu có. Dưới đây là những gì tôi đã thử:Bộ nhớ cache kết quả Doctrine không lưu vào bộ nhớ cache truy vấn

$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(); 

Dường như, thực thể người dùng được lưu trong bộ nhớ cache nhưng vẫn thực hiện truy vấn cho công ty. Có cách nào tôi có thể lấy cả hai cùng một lúc và đặt chúng vào bộ nhớ cache kết quả?

Tôi đã tìm thấy this, nhưng nó rất cũ và giải pháp của ông không hoạt động đối với tôi.

Được đề xuất với tôi rằng tôi làm this, nhưng loại đó đánh bại mục đích của bộ nhớ cache kết quả.

+0

i dont know giáo lý, nhưng bạn có thể cho mysql bộ nhớ cache nội bộ thử: SELECT SQL_CACHE u, c TỪ Entities \ User u LEFT JOIN u.company c ĐÂU u.id =: id – nfo

+0

Đó không phải là hữu ích. Tôi muốn có thể sử dụng tất cả những điều thực thể của Giáo Lý. – tubaguy50035

+1

Hãy thử thực thi tìm nạp EAGER (thay vì lười biếng). Bạn phải thêm fetch = "EAGER" vào định nghĩa quan hệ của bạn. – Cyprian

Trả lời

1

Tôi đã thử nghiệm điều này với học thuyết 2.3 sử dụng:

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

Khi tôi chạy nó lần đầu tiên, tôi thấy các truy vấn thực tế trong tôi sql-logger.
Khi tôi chạy nó lần thứ hai, thứ ba, v.v ..., tôi không thấy gì trong trình ghi nhật ký sql của mình.

Kết luận của tôi là nó hoạt động tốt.

Tôi đoán bạn chưa có cấu hình bộ nhớ cache kết quả hoặc bạn có cấu hình bộ nhớ cache không cố định (như ArrayCache) hoặc lỗi trong Dontrine 2.2.2 (mặc dù tôi không thể tìm thấy bất cứ điều gì về nó trên jira).

PS: Tôi thu thập từ một câu hỏi khác (Doctrine detaching, caching, and merging) mà bạn đã nâng cấp lên Doctrine 2.3. Bạn vẫn có vấn đề này?

PPS: Một nơi nào đó sau Doctrine 2.0 (tôi nghĩ là 2.2), bộ nhớ cache kết quả đã thay đổi. Thay vì bộ nhớ đệm kết quả ngậm nước, kết quả sql được lưu trữ (và hydration diễn ra mỗi lần chạy). Nếu bạn muốn lưu trữ kết quả ngậm nước, bạn sẽ phải sử dụng bộ nhớ đệm hydrat hóa (nhưng lưu trữ rằng các kết quả đó là không phải là được hợp nhất vào EntityManager).

+0

Giải pháp của tôi cho điều này là tạo "bộ nhớ cache kết quả" của riêng tôi. Đó là những gì các câu hỏi khác là về. – tubaguy50035

Các vấn đề liên quan