2012-11-12 15 views
6

में शामिल होने के साथ क्वेरी को कैश नहीं कर रहा है मैं उपयोगकर्ता की कंपनी के साथ उपयोगकर्ता इकाई के लिए क्वेरी करने का प्रयास कर रहा हूं। मैं चाहता हूं कि यह प्रश्न कैश किया जाए क्योंकि अंदर के डेटा में अक्सर परिवर्तन नहीं होगा, अगर बिल्कुल भी। नीचे मैं क्या कोशिश की है है:सिद्धांत परिणाम कैश

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

कदाचित, उपयोगकर्ता इकाई कैश किया गया है, लेकिन यह अभी भी कंपनी के लिए एक प्रश्न करता है। क्या एक तरीका है कि मैं एक ही समय में दोनों को ला सकता हूं और उन्हें परिणाम कैश में रखा जा सकता है?

मुझे this मिला, लेकिन यह बहुत पुराना है और उसका समाधान मेरे लिए काम नहीं करता है।

मुझे यह सुझाव दिया गया कि मैं this करता हूं, लेकिन परिणाम कैश के उद्देश्य को हरा देता है।

+0

मुझे नहीं सिद्धांत पता है, लेकिन आप mysql आंतरिक कैश आजमाइए कर सकते हैं: चयन SQL_CACHE यू उपयोगकर्ता, ग संस्थाओं से \ यू बायाँ शामिल हों u.company ग कहां u.id =: आईडी – nfo

+0

उपयोगी नहीं है यही कारण है कि। मैं सभी सिद्धांत इकाई चीजों का उपयोग करने में सक्षम होना चाहता हूं। – tubaguy50035

+1

ईगर लाने (आलसी के बजाय) को लागू करने का प्रयास करें। आपको अपनी संबंध परिभाषा में fetch = "EAGER" जोड़ना होगा। – Cyprian

उत्तर

1

मैं का उपयोग कर सिद्धांत 2.3 के साथ इस परीक्षण किया है:

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

जब मैंने इसे पहली बार चलाने के लिए, मैं अपने एसक्यूएल-लकड़हारा में वास्तविक क्वेरी देखते हैं।
जब मैं इसे दूसरा, तीसरा, आदि समय चलाता हूं, तो मुझे अपने एसक्यूएल-लॉगर में कुछ भी दिखाई नहीं देता है।

मेरा निष्कर्ष यह ठीक काम कर रहा है।

मुझे लगता है कि आपको या तो परिणाम-कैश कॉन्फ़िगर नहीं मिला है, या आपके पास एक गैर-स्थायी परिणाम-कैश (जैसे ArrayCache) कॉन्फ़िगर किया गया है, या यह डोंट्रिन 2.2.2 में एक बग है (हालांकि मुझे नहीं मिल रहा है जिरा पर इसके बारे में कुछ भी)।

पीएस: मैं एक और प्रश्न (Doctrine detaching, caching, and merging) से इकट्ठा करता हूं जिसे आपने डॉक्टर 2.3 में अपग्रेड कर दिया है। क्या आपको अभी भी यह समस्या है?

पीपीएस: कहीं भी डॉक्टर 2.0 के बाद (मुझे लगता है कि यह 2.2 था), परिणाम-कैश बदल गया। हाइड्रेटेड परिणाम कैशिंग के चरण में, एसक्यूएल-परिणाम कैश किया जाता है (और प्रत्येक रन में हाइड्रेशन होता है)। यदि आप हाइड्रेटेड परिणाम कैश करना चाहते हैं, तो आपको हाइड्रेशन-कैश का उपयोग करना होगा (लेकिन सावधान रहें कि वे परिणाम EntityManager में विलय नहीं किए गए हैं)।

+0

मेरा समाधान मेरा स्वयं का "परिणाम कैश" बनाना था। यही सवाल है कि दूसरा सवाल है। – tubaguy50035

संबंधित मुद्दे