2008-10-22 8 views
8

Nous évaluons db4o (un SGBD OO de http://www.db4o.com). Nous avons mis au point un test de performance pour le mode client/serveur, où nous lançons un serveur, puis le martelons avec plusieurs clients à la fois. Il semble que le serveur ne peut traiter que la requête d'un client à la fois.Le client/serveur db4o semble pouvoir uniquement traiter une requête à la fois?

Avons-nous manqué un commutateur de configuration quelque part qui permet ce scénario? L'implémentation du serveur est ci-dessous. Le client se connecte, interroge (en lecture seule) et se déconnecte par opération, et les opérations s'exécutent immédiatement après l'autre à partir de plusieurs threads de travail dans le processus client. Nous voyons le même comportement si nous faisons tourner un processus client avec un travailleur chacun contre le même serveur.

Des suggestions? Edit: Nous avons maintenant découvert, et essayé, les QueryModes Lazy and Snapshot, et bien que cela atténue (partiellement) le problème du serveur bloquant, nous voyons toujours des problèmes de simultanéité significatifs lorsque nos clients (nous testons 40 tests simultanés ...). les clients qui attendent 1-300ms avant d'émettre une requête d'opération aléatoire) sur le serveur. Il semble y avoir des exceptions émanant du fournisseur LINQ et des IO internes :-(

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

S'il vous plaît visitez les forums db4o afin que nous puissions trouver une solution – Goran

+0

Vous perdez du temps mec .. disons que tout irait bien au top 100 % ... Votre évaluation va-t-elle aboutir à la dissolution de SQL et du framework d'entité en faveur de db4o? vraiment désolé d'être ennuyeux ... c'est juste que je suis déjà passé par là .db4o doit supporter tous les aspects du langage C# sans limitation que ce soit r renoncer à la bataille. –

+0

@ G.Y Vous avez vu cette question a été posée en 2008, non? –

Répondre

1

Eh bien, il y a quelque chose sur les serveurs DB40 qui ne permet pas trop de clients à une heure car il est trop

Questions connexes