2013-03-12 4 views
7

डाले मैं एक MVC3 दूसरे स्तर कैश प्रदाता के रूप में nHibernate और memcached का उपयोग कर आवेदन कर सकते है। हम अजीब कास्टिंग मुद्दों को प्राप्त कर रहे हैं (लेकिन हाल ही में अधिक बार)। यह यादृच्छिक रूप से होता है और memcached कैश को अमान्य करने से समस्या ठीक हो जाएगी।nHibernate memcached और यादृच्छिक अमान्य साथ दूसरे स्तर कैश

यह केवल हमारे उत्पादन पर्यावरण में होता है क्योंकि हम अपने अन्य वातावरण में memcached नहीं चलाते हैं। हालांकि मैं स्थानीय रूप से memcached चलाता हूं और इसे किसी भाग्य के साथ स्थानीय रूप से होने की कोशिश की है।

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

Unable to cast object of type 'System.Int32' to type 'System.String'. 

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.InvalidCastException: Unable to cast object of type 'System.Int32' to type 'System.String'. 

Source Error: 

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below. 

Stack Trace: 


[InvalidCastException: Unable to cast object of type 'System.Int32' to type 'System.String'.] 
    (Object , Object[] , SetterCallback) +4270 
    NHibernate.Tuple.Entity.PocoEntityTuplizer.SetPropertyValuesWithOptimizer(Object entity, Object[] values) +80 

[PropertyAccessException: Invalid Cast (check your mapping for property type mismatches); setter of MyApplication.Business.Data.Program] 
    NHibernate.Tuple.Entity.PocoEntityTuplizer.SetPropertyValuesWithOptimizer(Object entity, Object[] values) +207 
    NHibernate.Tuple.Entity.PocoEntityTuplizer.SetPropertyValues(Object entity, Object[] values) +97 
    NHibernate.Cache.Entry.CacheEntry.Assemble(Object[] values, Object result, Object id, IEntityPersister persister, IInterceptor interceptor, ISessionImplementor session) +306 
    NHibernate.Cache.Entry.CacheEntry.Assemble(Object instance, Object id, IEntityPersister persister, IInterceptor interceptor, ISessionImplementor session) +147 
    NHibernate.Event.Default.DefaultLoadEventListener.AssembleCacheEntry(CacheEntry entry, Object id, IEntityPersister persister, LoadEvent event) +434 
    NHibernate.Event.Default.DefaultLoadEventListener.LoadFromSecondLevelCache(LoadEvent event, IEntityPersister persister, LoadType options) +800 
    NHibernate.Event.Default.DefaultLoadEventListener.DoLoad(LoadEvent event, IEntityPersister persister, EntityKey keyToLoad, LoadType options) +560 
    NHibernate.Event.Default.DefaultLoadEventListener.Load(LoadEvent event, IEntityPersister persister, EntityKey keyToLoad, LoadType options) +229 
    NHibernate.Event.Default.DefaultLoadEventListener.ProxyOrLoad(LoadEvent event, IEntityPersister persister, EntityKey keyToLoad, LoadType options) +438 
    NHibernate.Event.Default.DefaultLoadEventListener.OnLoad(LoadEvent event, LoadType loadType) +943 
    NHibernate.Impl.SessionImpl.FireLoad(LoadEvent event, LoadType loadType) +99 
    NHibernate.Impl.SessionImpl.Get(String entityName, Object id) +117 
    NHibernate.Impl.SessionImpl.Get(Object id) +70 
    MyApplication.Business.Repositories.Repository`1.Get(Object id) +148 
+0

MyApplication.Business.Data.Program क्या है? क्या यह हमेशा एक ही अपवाद है? स्ट्रिंग => Int32 मुझे (यादृच्छिक रूप से) Enum, या query.substitutions, अंतर्निहित रूपांतरण के बारे में सोचता है ... – jbl

+0

यह हमेशा एक ही अपवाद है। कार्यक्रम nHibernate इकाई है। एक बार जब त्रुटि शुरू होती है तब तक यह कैश अमान्य होने तक घूमता है। हालांकि प्रारंभिक त्रुटि यादृच्छिक रूप से प्रतीत होती है। –

+0

क्या आप अपने सेटअप के बारे में कुछ और बता सकते हैं? NHibernate का क्या संस्करण? कौन सा कैश प्रदाता? Memcached का क्या वितरण? इत्यादि – DanP

उत्तर

3

हम एक ही समस्या का सामना कर रहे हैं और हम इस समस्या को दूसरे स्तर कैश में कैश प्रविष्टियों अमान्य की ओर केंद्रित है। हमारे मामले में समस्या उत्पन्न होती है जब हम दूसरे स्तर के कैश में कैश किए गए टेबल/इकाइयों से कॉलम/गुण जोड़ते या हटाते हैं और परिवर्तन को तैनात करते हैं। कोड पांच कॉलम (तर्क के लिए) की अपेक्षा करता है जबकि कैश छह कॉलम स्टोर करता है।

एक रणनीति है कि हम अपने भंडार में कार्यरत अपवाद को पकड़ने और कैश रद्द करने के लिए है। फिर हम मिलते हैं।

public override T Get(int id) 
    { 
     try 
     { 
      return base.Get(id); 
     } 
     catch (InvalidCastException) 
     { 
      _sessionFactory.EvictEntity(typeof (T).Name); 
      return Get(id); 
     } 
    } 

आशा है कि इससे मदद मिलती है!

+0

ध्यान दें कि आप भी कुछ इस तरह का उपयोग कर सकते हैं: कैश रद्द करने के लिए http://stackoverflow.com/questions/2660714/how-to-clear-the-entire-second-level-cache-in-nhibernate। हम इसे अपने बैकएंड व्यवस्थापक पैनल में बेनकाब करते हैं और इसे तैनात करने के बाद चलाते हैं जो दूसरे स्तर के कैश में संग्रहीत इकाइयों को बदलता है। – DanP

+0

हमने बाद में एक नए मंच पर स्विच किया है लेकिन मैं इस जवाब को स्वीकार करूंगा क्योंकि ऐसा कुछ ऐसा होता जो मैं वास्तव में कोशिश कर सकता था! –

0

अधिकांश शायद इस उत्पादन वातावरण और अपने स्थानीय पर प्रश्नों द्वारा लौटाए गए विभिन्न डाटासेट के कारण होता है। ऑब्जेक्ट मैपर को इसकी अपेक्षा से अलग डेटा मिल रहा है। डेटा को कन्वर्ट करने का प्रयास करते समय आपको इन अपवादों को प्राप्त हो रहा है।

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