2008-10-22 23 views
8

हम डीबी 4o का मूल्यांकन कर रहे हैं (http://www.db4o.com से ओओ-डीबीएमएस)। हमने क्लाइंट/सर्वर मोड के लिए एक प्रदर्शन परीक्षण रखा है, जहां हम एक सर्वर को स्पिन करते हैं, फिर इसे कई ग्राहकों के साथ एक साथ दबाते हैं। ऐसा लगता है कि सर्वर एक समय में केवल एक ग्राहक की क्वेरी को संसाधित कर सकता है।db4o क्लाइंट/सर्वर केवल एक समय में एक क्वेरी को संसाधित करने में सक्षम प्रतीत होता है?

क्या हमने कहीं इस कॉन्फ़िगरेशन स्विच को याद किया है जो इस परिदृश्य के लिए अनुमति देता है? सर्वर कार्यान्वयन नीचे है। क्लाइंट कनेक्ट करता है, क्वेरी (केवल पढ़ने के लिए), और प्रति ऑपरेशन डिस्कनेक्ट करता है, और क्लाइंट प्रक्रिया में कई कार्यकर्ता धागे से दूसरे के बाद ऑपरेशन चलाता है। हम एक ही व्यवहार देखते हैं यदि हम एक ग्राहक प्रक्रिया को एक ही सर्वर के साथ एक कार्यकर्ता के साथ स्पिन करते हैं।

कोई सुझाव?

संपादित करें: अब हमने आलसी और स्नैपशॉट क्वेरीमोड्स की खोज की है, और कोशिश की है, और हालांकि यह अवरुद्ध सर्वर समस्या (आंशिक रूप से) को कम करता है, फिर भी हम अपने ग्राहकों के साथ महत्वपूर्ण समवर्ती समस्याएं देखते हैं (हम 40 समवर्ती परीक्षण- क्लाइंट जो यादृच्छिक ऑपरेशन-अनुरोध जारी करने से पहले 1-300ms प्रतीक्षा करते हैं) सर्वर पर हथौड़ा। वहाँ :-(

public class Db4oServer : ServerConfiguration, IMessageRecipient 
{ 
    private bool stop; 

    #region IMessageRecipient Members 

    public void ProcessMessage(IMessageContext con, object message) 
    { 
     if (message is StopDb4oServer) 
     { 
      Close(); 
     } 
    } 

    #endregion 

    public static void Main(string[] args) 
    { 
     //Ingestion.Do(); 
     new Db4oServer().Run(true, true); 
    } 

    public void Run(bool shouldIndex, bool shouldOptimizeNativeQueries) 
    { 
     lock (this) 
     { 
      var cfg = Db4oFactory.NewConfiguration(); 
      if (shouldIndex) 
      { 
       cfg.ObjectClass(typeof (Sequence)) 
           .ObjectField("<ChannelID>k__BackingField") 
           .Indexed(true); 
       cfg.ObjectClass(typeof (Vlip)) 
           .ObjectField("<ChannelID>k__BackingField") 
           .Indexed(true); 
      } 
      if (shouldOptimizeNativeQueries) 
      { 
       cfg.OptimizeNativeQueries(true); 
      } 

      var server = Db4oFactory.OpenServer(cfg, FILE, PORT); 
      server.GrantAccess("0", "kieran"); 
      server.GrantAccess("1", "kieran"); 
      server.GrantAccess("2", "kieran"); 
      server.GrantAccess("3", "kieran"); 
      //server.Ext().Configure().ClientServer().SingleThreadedClient(false); 
      server.Ext().Configure().MessageLevel(3); 
      server.Ext().Configure().Diagnostic().AddListener(new DiagnosticToConsole()); 
      server.Ext().Configure().ClientServer().SetMessageRecipient(this); 
      try 
      { 
       if (!stop) 
       { 
        Monitor.Wait(this); 
       } 
      } 
      catch (Exception e) 
      { 
       Console.WriteLine(e.ToString()); 
      } 
      server.Close(); 
     } 
    } 

    public void Close() 
    { 
     lock (this) 
     { 
      stop = true; 
      Monitor.PulseAll(this); 
     } 
    } 
} 
+1

कृपया डीबी 4o मंचों पर जाएं ताकि हम समाधान कर सकें। – Goran

+0

आप समय दोस्त बर्बाद कर रहे हैं .. मान लीजिए सब कुछ शीर्ष पायदान 100 काम करेगा % ... क्या आपका मूल्यांकन डीबी 4o के पक्ष में एसक्यूएल और इकाई ढांचे को तोड़ने के लिए निष्कर्ष निकाला जा रहा है? वास्तव में परेशान होने के लिए खेद है .. यह सिर्फ इतना है कि मैं पहले वहां गया हूं। db4o को सी # भाषा के सभी पहलुओं का समर्थन नहीं करना चाहिए जो भी ओ आर युद्ध को जब्त कर लिया। –

+0

@ जी.ए. आपने देखा कि 2008 में यह सवाल पूछा गया था, है ना? –

उत्तर

1

ठीक है, वहाँ है DB40 सर्वर पर कुछ है कि एक समय में पर बहुत अधिक ग्राहकों की अनुमति नहीं है, क्योंकि यह भी है आईओ internals LINQ प्रदाता से और से निकलती अपवाद प्रतीत कुछ लोगों को संभालने के लिए बहुत कुछ। आपने इसे लॉक कर दिया जिसने इस मामले में मदद करने के लिए कुछ भी नहीं किया।