2012-05-15 8 views
5

मुझे सिद्धांत के साथ समस्या है। मुझे कैशिंग पसंद है, लेकिन अगर मैं एक इकाई को अद्यतन करता हूं और फ्लश करता हूं, तो क्या नहीं करना चाहिए 2 कैश को साफ़ करने में सक्षम होना चाहिए? अन्यथा कैश का बहुत कम उपयोग होता है क्योंकि इस परियोजना में बहुत सी बातचीत होती है और मुझे सचमुच हमेशा प्रत्येक क्वेरी के लिए कैश को अक्षम करना होगा। यदि कैश हमेशा उन्हें पुराना, कैश संस्करण दिखाएगा तो उपयोगकर्ता उनकी बातचीत नहीं देख पाएंगे।अद्यतन तत्वों के सिद्धांत 2 कैशिंग

क्या कोई रास्ता इसके आसपास है?

+0

क्या आप सिर्फ कैश को पूरी तरह बंद करना चाहते हैं? मुझे पता है कि आप $ हटाए गए = $ कैश ड्राइव के साथ कैश साफ़ कर सकते हैं-> deleteAll(); – Gohn67

+0

@ गोह्न 67: मैं कैशड्राइवर कैसे प्राप्त करूं? –

उत्तर

1

यह कैश को साफ़ करने के तरीके पर डॉक्टर 2 पर प्रलेखन के अनुसार है। मुझे यह भी यकीन नहीं है कि आप यही चाहते हैं, लेकिन मुझे लगता है कि यह कोशिश करने के लिए कुछ है।

डॉक्ट्राइन 2 के कैश ड्राइवर में कैश किए गए प्रविष्टियों को हटाने के विभिन्न स्तर हैं।

आप आप ऐसा करेंगे चाहते हैं

तो सभी को नष्ट करने के, प्रत्यक्ष आईडी द्वारा नष्ट कर सकते हैं उपसर्ग और सादे कैश में सभी मूल्यों को हटा कर एक regex का उपयोग कर, प्रत्यय द्वारा:

$deleted = $cacheDriver->deleteAll(); 

और उपसर्ग से नष्ट करने के लिए, तुम क्या चाहते हैं:

$deleted = $cacheDriver->deleteByPrefix('users_'); 

मुझे यकीन है कि के लिए खुदाई करने के लिए कैसे Doctrine2 नाम उनके कैश आईडी हालांकि, ताकि आप होगा नहीं हूँ। कैश हटाने पर

सूचना यहाँ पाया जाता है: http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/caching.html#deleting

कैश ड्राइवर पाने के लिए, आप निम्न कर सकते। दस्तावेज़ों में इसका वर्णन नहीं किया गया था, इसलिए मैंने बस कोड के माध्यम से पता लगाया।

मैं आप इस उदाहरण में एक इकाई के प्रबंधक उदाहरण है यह सोचते हैं हूँ:

$config = $em->getConfiguration(); //Get an instance of the configuration 
$queryCacheDriver = $config->getQueryCacheImpl(); //Gets Query Cache Driver 
$metadataCacheDriver = $config->getMetadataCacheImpl(); //You probably don't need this one unless the schema changed 

वैकल्पिक रूप से, मुझे लगता है कि आप रजिस्ट्री वर्ग के कुछ प्रकार में cacheDriver उदाहरण बचाने के लिए और इसे उस तरह से पुनः प्राप्त कर सकते हैं। लेकिन आपकी वरीयता पर निर्भर करता है। व्यक्तिगत रूप से मैं पंजीकरण पर निर्भर नहीं होने की कोशिश करता हूं।

एक और चीज जो आप कर सकते हैं वह बताती है कि आप परिणाम कैश का उपयोग न करने के लिए निष्पादित कर रहे हैं। दोबारा मुझे नहीं लगता कि यह वही है जो आप चाहते हैं, लेकिन इसे वहां फेंक दें। मुख्य रूप से ऐसा लगता है कि आप क्वेरी कैश को पूरी तरह से बंद कर सकते हैं। ऐसा तब तक होता है जब तक कि यह केवल कुछ विशिष्ट प्रश्न न हो जहां आप कैश का उपयोग नहीं करना चाहते हैं।

यह उदाहरण डॉक्स से है: http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/caching.html#result-cache

$query = $em->createQuery('select u from \Entities\User u'); 
$query->useResultCache(false); //Don't use query cache on this query 
$results = $query->getResult(); 
+1

मुझे आश्चर्य है, क्या उन्होंने v.2.2.2 पर "deleteByPrefix()" को हटा दिया? मैंने सिद्धांत स्रोत पर पूरी खोज की है और इन पद्धतियों को –

+0

'deleteByPrefix' memcache ड्राइवर के लिए उपलब्ध नहीं है। – Sithu

3

क्या आप एक ही रनटाइम (अनुरोध) के भीतर एक नई इकाई को सहेजने और लाने के बारे में बात कर रहे हैं? यदि ऐसा है तो आपको इकाई को रीफ्रेश करने की आवश्यकता है।

$entity = new Entity(); 
$em->persist($entity); 
$em->flush(); 
$em->refresh($entity); 

इकाई प्रबंधित किया जाता है और आप परिवर्तन करते हैं तो इन इकाई वस्तु को लागू किया जाएगा, लेकिन जब $ em- बुला केवल अपने डेटाबेस के लिए कायम> फ्लश()।

यदि आपका कैश एक नए अनुरोध के लिए पुराना डेटासेट लौटा रहा है (इसके बावजूद इसे डीबी में सफलतापूर्वक अपडेट किया जा रहा है) तो ऐसा लगता है जैसे आपने एक बग खोज ली है। आप यहां कौन से फाइल कर सकते हैं >>http://www.doctrine-project.org/jira/secure/Dashboard.jspa

+0

मैंने बिल्कुल कोशिश की। मैं इकाई लोड करता हूं, बदलाव करता हूं, इसे जारी रखता हूं, इसे फ्लश करता हूं, इसे रीफ्रेश करता हूं। अब भी वही। लेकिन शायद ऐसा इसलिए है क्योंकि मैं इकाई को रीफ्रेश करता हूं, न कि इसके सभी संबंधित ऑब्जेक्ट्स, इसलिए संबंधित ऑब्जेक्ट अभी भी कैश से आते हैं? –

+0

जब आप इकाई को "लोड" कहते हैं, तो क्या इसका मतलब है कि इसे बनाएं या इसे डीबी से लाएं? यदि इसे "प्रबंधित" स्थिति में लाया जा रहा है और आपको उस पर लगातार() विधि का उपयोग करने की आवश्यकता नहीं है। एक प्रबंधित इकाई को रीफ्रेश करने से आपके द्वारा किए गए किसी भी संशोधन को हटा दिया जा सकता है। यदि यह नया है: बनाएं -> जारी रखें -> फ्लश -> रीफ्रेश करें। यदि यह प्रबंधित (डीबी से प्राप्त): fetch -> (परिवर्तन करें) -> फ्लश। –

+0

मैंने कोशिश की, रीफ्रेश वास्तव में कैश से लड़ने में मदद नहीं करता है। यह इस तरह काम करता है: $ इकाई = $ सेवा-> loadCached(); echo $ इकाई-> getData(); // रिटर्न डेटा जो कैश किया गया है $ em-> ताज़ा करें(); echo $ इकाई-> getData(); // रिटर्न डेटा जो कैश नहीं किया गया है जो अच्छा लगता है, लेकिन वास्तविक कैश को अमान्य नहीं करता है, इसलिए लोडकैच() के अगले भाग पर आपको अभी भी पुराना डेटा मिल जाएगा। ऐसा लगता है कि Gohn67 सुझाए गए कैश को मैन्युअल रूप से साफ़ करने का कोई दूसरा तरीका नहीं है। –

3

Doctrine2 कभी नहीं इस तरह के deleteByPrefix, जो कुछ बिंदु पर Doctrine1 में था (3 साल पहले) और हटा दिया गया था, क्योंकि यह अधिक परेशानी का कारण बना के रूप में उन हटाने के तरीकों है।

पृष्ठ http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/caching.html#deleting पुराना है (Doctrine2 दस्तावेज़ का अगला संस्करण उन विधियों को हटा देगा)। एकमात्र चीज जो आप कर सकते हैं वह मैन्युअल रूप से कैश का प्रबंधन कर रही है: आईडी को ढूंढें और प्रत्येक अपडेट के बाद इसे मैन्युअल रूप से हटा दें।

अधिक उन्नत सिद्धांत कैशिंग डब्ल्यूआईपी है: https://github.com/doctrine/doctrine2/pull/580

+0

हाँ, पुरानी टिकट, अभी भी मैं उत्सुक हूँ। मैं "deleteByPrefix" में देख रहा हूं, लेकिन इसके बारे में कुछ भी नहीं मिला। इसमें किस तरह की समस्याएं थीं? प्रदर्शन के कारण? शायद मुझे इसके बारे में एक नया सवाल खोलना चाहिए। – DoppyNL

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