2011-02-07 12 views
8

में सिद्धांत की क्वेरी कैश को रोकना मेरे सिम्फनी/डॉक्टर ऐप में, मेरे पास एक प्रश्न है जो RANDOM() द्वारा आदेश दिया गया है। मैं इस विधि को कई बार कॉल करता हूं, लेकिन ऐसा लगता है कि क्वेरी के परिणाम कैश किए जा रहे हैं। मुझे useQueryCache और useResultCache दोनों को null पास करने कासिम्फनी

$query = $table->createQuery('p') 
    ->select('p.*, RANDOM() as rnd') 
    ->orderBy('rnd') 
    ->limit(1) 
    ->useQueryCache(null) 
    ->useResultCache(null); 
$result = $query->fetchOne(); 

दुर्भाग्य से, एक ही रिकॉर्ड हर बार दिया जाता है, भले ही:

यहाँ मेरी प्रासंगिक कोड है। मैंने null के बजाय false का उपयोग करने का प्रयास किया, लेकिन यह भी काम नहीं किया। अंत में, मैंने setResultCacheLifeSpan(0) और setResultCacheLifeSpan(-1) दोनों को कॉल करने का भी प्रयास किया, लेकिन न तो कॉल ने कोई फर्क नहीं पड़ता।

कैशिंग को रोकने के तरीके पर कोई अंतर्दृष्टि क्योंकि जब भी मैं इस विधि को कॉल करता हूं तो मुझे एक अलग यादृच्छिक पंक्ति चुननी चाहिए?

संपादित करें: मैं भी clearResultCache() बुला कोशिश की, लेकिन है कि बस बताते हुए एक त्रुटि के कारण समाप्त हो गया: "आरंभ नहीं परिणाम कैश ड्राइवर"।

संपादित करें 2: के रूप में अनुरोध किया है, यहाँ $query->getSqlQuery() बुला द्वारा उत्पन्न एसक्यूएल है:

SELECT c.id AS c__id, c.name AS c__name, c.image_url AS c__image_url, 
c.level AS c__level, c.created_at AS c__created_at, c.updated_at 
AS c__updated_at, RANDOM() AS c__0 FROM cards c ORDER BY c__0 LIMIT 1 
+0

हाय मैट, क्या आपने '$ query-> useResultCache (false)' कोशिश की है? – Darmen

+0

हाँ, मैंने अपने प्रश्न में उल्लेख किया कि मैंने झूठी उपयोग करने की कोशिश की, लेकिन यह भी काम नहीं किया। –

+1

क्वेरी कैश को अक्षम क्यों करें? सवाल वही बना हुआ है! आपको केवल परिणाम कैश साफ़ करने की आवश्यकता है। हो सकता है कि आप अपना डीबीएमएस कैश कर रहे हों ... आप यह देखने के लिए क्वेरी लॉग कर सकते हैं कि प्रत्येक अनुरोध के लिए कोई क्वेरी बनाई गई है या नहीं। – greg0ire

उत्तर

4

यह पता चला मैं एक मूर्ख हूँ। मैंने इस प्रश्न के लिए अपनी क्वेरी को सरल बनाने की कोशिश की, और ऐसा करने में, मैंने सही कारण नहीं पकड़ा। मेरे पास where() और andWhere() कॉल था, और परिस्थितियों के संयोजन के परिणामस्वरूप केवल एक संभावित रिकॉर्ड मिलान किया गया। जवाब देने का समय लेने के लिए धन्यवाद, हर कोई, आपका समय बर्बाद करने के लिए खेद है!

2

सिद्धांत आपके द्वारा उसी अनुरोध/स्क्रिप्ट रन में बनाए गए इकाइयों को भी कैश करता है।

उदाहरण के लिए:

$order = new Order(); 
$order->save(); 

sleep(10); // Edit this record in de DB in another procces. 

$q = new Doctrine_Query(); 
$result = $q->select() 
      ->from('Order o') 
      ->where('o.id = '.$order->id); 
$order = $result->getFirst(); 
print_r($order->toArray()); 

print_r परिवर्तन आप नींद के दौरान किए गए शामिल नहीं होंगे।

$manager = Doctrine_Manager::getInstance(); 
$connection = $manager->getCurrentConnection(); 
$tables = $connection->getTables(); 
foreach ($tables as $table) { 
    $table->clear(); 
} 

पुनश्च:: इस उत्तर जोड़ी मैं क्योंकि इस विषय मुद्दा उपरोक्त समस्याओं का समाधान करने की कोशिश कर पाया

निम्नलिखित कोड मेमोरी कैश उस तरह निकाल देंगे।

+0

बहुत अच्छी व्याख्या। –

+0

यह मेरे लिए वास्तव में सहायक था और स्पष्टीकरण के लिए धन्यवाद। – Thilanka