2012-04-07 16 views
6

मेरे पास एक भंडार है जहां मैं परिणाम कैशिंग सेट अप करने का प्रयास कर रहा हूं। मैं केवल यह कैसे करना है इसके लिए ऑनलाइन एक उदाहरण प्राप्त करने में सक्षम हूं ... लेकिन जब मैं अपने भंडारों में से एक में उदाहरण लागू करता हूं तो मुझे एक त्रुटि मिलती है। मैं अपने कैशिंग के लिए एपीसी का उपयोग कर रहा हूं और मेरी config.yml फ़ाइल में एपीसी का उपयोग करने के लिए क्वेरी कैशिंग सक्षम कर दिया है। मैं एपीसी को 512 एम आवंटित दिया हो और इसकी केवल का उपयोग कर 50M वर्तमान में (इस का 23M इस एकल में विफल रहा है कैश प्रविष्टि के लिए है)मैं symfony2 भंडार में क्वेरी परिणाम कैशिंग निर्दिष्ट कैसे करूं?

यहाँ मैं भंडार कोड है:

class AchievementRepository extends EntityRepository 
{ 
    function findAchievementsByCategory($categoryObj) 
    { 
     $em=$this->getEntityManager()->createQuery("SELECT a FROM FTWGuildBundle:Achievement a where a.category=:category order by a.title") 
      ->setParameter('category',$categoryObj); 
     $em->useResultCache(true,3600,'findAchievementsByCategory'); 
     $result=$em->getResult(); 
     return $result; 
    } 
} 

और जब यह मार डाला जाता है मैं निम्न त्रुटि

Notice: apc_store() [<a href='function.apc-store'>function.apc-store</a>]: &quot;type&quot; returned as member variable from __sleep() but does not exist in /data/www/ftw2/Symfony/vendor/doctrine-common/lib/Doctrine/Common/Cache/ApcCache.php line 80 

जब मैं अपने apc.php फ़ाइल में देखने के लिए देखने के लिए क्या कैश किया गया है, मैं

की एक संग्रहीत मूल्य के साथ उपयोगकर्ता कैश अनुभाग में अपने कैश प्रविष्टि मिले

क्या कोई मुझे कुछ दिशा प्रदान कर सकता है कि मैं कहां गलत हो गया हूं?

इस इकाई में कुछ कॉलम हैं जो ManyToOne हैं, क्या मुझे इस क्वेरी पर काम करने के लिए आलसी लोड अक्षम करने की आवश्यकता है? यदि हां, तो कैसे? संपादित करें: मैं जोड़कर उत्सुक लोड सक्षम हो, तो लाने = मेरी ManyToOne मानचित्रण करने के लिए "उत्सुक" ... कोई सेब :(

संपादित करें # 2: उत्तर दिए - कामगार वर्ग कोड (ध्यान दें, इकाई वर्ग के सभी गुण (अचीवमेंट) संरक्षित करने के लिए बदल दिया गया है)

class AchievementRepository extends EntityRepository 
{ 
    function findAchievementsByCategory($categoryObj) 
    { 
     $em=$this->getEntityManager()->createQuery("SELECT a FROM FTWGuildBundle:Achievement a where a.category=:category order by a.title") 
      ->setParameter('category',$categoryObj); 
     $em->useResultCache(true,3600,'findAchievementsByCategory'); 
     $result=$em->getArrayResult(); 
     return $result; 
    } 
} 

उत्तर

3

जब सिद्धांत एक इकाई कैश, यह इसके बारे में धारावाहिक राज्य। समस्या है, निजी संपत्तियों (जब सिद्धांत द्वारा उत्पन्न) डिफ़ॉल्ट दृश्यता धारावाहिक नहीं किया जा सकता बचाता है। करने के लिए इसे ठीक करें, आपको अपनी इकाई गुणों को संरक्षित करना होगा। अधिक जानकारी: http://doctrine-orm.readthedocs.org/en/2.0.x/reference/working-with-objects.html#merging-entities

दूसरी बात a know issue है जो अंततः सिद्धांत संस्करण 2.2 में तय की गई है, जो सिम्फनी 2.1 में होगी। यदि आप किसी कारण से अपग्रेड नहीं कर सकते हैं, तो संस्थाओं को कैश करने का एकमात्र तरीका है जनसंख्या इकाइयों की बजाय getArrayResult का उपयोग करना।

+0

धन्यवाद! मैंने संरक्षित गुणों का उपयोग करने के लिए अद्यतन किया और getRrult() को getArrayResult() प्राप्त करने के लिए बदल दिया और अब यह सही ढंग से कैश करता है। – Chris

+0

@ क्रिस, आपने परीक्षण कैसे किया था कि परिणाम कैश किया गया था या नहीं? – cbacelar

+0

@cbacelar - कुछ तरीके 1) क्वेरी डीबगर का उपयोग करें, एक पृष्ठ प्रस्तुत करें और देखें कि कितने और कौन से प्रश्न चल रहे हैं। आप यहां अपने गैर कैश किए गए प्रश्न देखेंगे। पृष्ठ को रीफ्रेश करें और आप देखेंगे कि कैश किए गए प्रश्न निष्पादित नहीं किए गए हैं। 2) कैश में अधिक डेटा या अधिक रिकॉर्ड देखने के लिए अपने कैश (memcached, apc, आदि) पर आंकड़े जांचें। एपीसी में एक अच्छा इंटरफेस है जिसे आप कैश में प्रत्येक इकाई को देखने की अनुमति देने के लिए इंस्टॉल कर सकते हैं (कुंजी, मूल्य और आंकड़े सहित) – Chris

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