2008-10-22 8 views
8

Wir bewerten db4o (ein OO-DBMS von http://www.db4o.com). Wir haben einen Leistungstest für den Client/Server-Modus zusammengestellt, bei dem wir einen Server hochfahren und ihn dann mit mehreren Clients gleichzeitig hämmern. Es sieht so aus, als ob der Server nur die Abfrage eines Clients gleichzeitig verarbeiten kann.db4o Client/Server scheint nur eine Abfrage gleichzeitig verarbeiten zu können?

Haben wir irgendwo einen Konfigurationsschalter verpasst, der dieses Szenario zulässt? Serverimplementierung ist unten. Der Client stellt eine Verbindung her, fragt (schreibgeschützt) ab und trennt die Verbindung je Operation, und Operationen werden unmittelbar nacheinander von mehreren Arbeitsthreads im Clientprozess ausgeführt. Wir sehen dasselbe Verhalten, wenn wir einen Client-Prozess mit jeweils einem Arbeiter gegen den gleichen Server hochfahren.

Irgendwelche Vorschläge?

Edit: Wir haben jetzt die Lazy und Snapshot QueryModes entdeckt und ausprobiert, und obwohl dies das blockierende Serverproblem (teilweise) verringert, sehen wir immer noch erhebliche Nebenläufigkeitsprobleme bei unseren Clients (wir führen 40 gleichzeitige Test- Clients, die 1-300ms warten, bevor sie eine zufällige Operation-Anfrage ausgeben) hammer auf dem Server. Offensichtlich gibt es Ausnahmen von dem LINQ-Anbieter ausgehen zu sein und von den IO-Interna :-(

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

Bitte besuchen Sie die db4o Foren, damit wir eine Lösung erarbeiten können – Goran

+0

Sie verschwenden Zeit, Alter .. sagen wir, alles würde erstklassige 100 funktionieren % ... wird Ihre Bewertung schließen, um SQL und Entity-Framework zugunsten von db4o aufzulösen? wirklich tut mir leid, nervig zu sein ... es ist nur, dass ich schon einmal dort gewesen bin.db4o muss alle Aspekte der C# -Sprache uneingeschränkt unterstützen was auch immer Ich vergebe den Kampf. –

+0

@ G.Y Sie haben diese Frage im Jahr 2008 gesehen, oder? –

Antwort

1

Nun wird es etwas auf dem DB40-Server, die nicht zu in einer Zeit, viele Kunden auf nicht zulässt, da es zu ist viel für einige zu handhaben.Sie auch gesperrt, die nichts in diesem Fall zu helfen.