2008-10-22 10 views
8

Oceniamy db4o (OO-DBMS z http://www.db4o.com). Przygotowaliśmy test wydajności dla trybu klient/serwer, w którym uruchamiamy serwer, a następnie uruchamiamy go z kilkoma klientami jednocześnie. Wygląda na to, że serwer może przetwarzać tylko jedno zapytanie klienta na raz.Klient/serwer db4o wydaje się być w stanie przetworzyć tylko jedno zapytanie naraz?

Czy przegapiliśmy przełącznik konfiguracji, który pozwala na taki scenariusz? Implementacja serwera znajduje się poniżej. Klient łączy, kwerendy (tylko do odczytu) i rozłącza na operację, a operacje uruchamiają jeden po drugim z kilku wątków roboczych w procesie klienta. Widzimy to samo zachowanie, jeśli rozpoczynamy jeden proces klienta z jednym pracownikiem na tym samym serwerze.

Wszelkie sugestie?

Edytuj: Znaleźliśmy i wypróbowaliśmy Lazy i Snapshot QueryModes, i choć zmniejsza to problem serwera blokującego (częściowo), nadal widzimy znaczące problemy z współbieżnością, gdy nasi klienci (prowadzimy 40 równoległych testów) klienci, którzy czekają 1-300 ms przed wydaniem losowego żądania operacji) młotkiem na serwerze. Nie wydaje się być wyjątki pochodzące od dostawcy LINQ oraz z wewnętrznych IO :-(

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

Odwiedź fora db4o, abyśmy mogli znaleźć rozwiązanie .. – Goran

+0

Marnujesz kolesia .. załóżmy, że wszystko będzie działało na najwyższym poziomie 100 % ... czy twoja ocena zakończy się rozwiązaniem SQL i struktury encji na korzyść db4o? naprawdę przykro mi być denerwującym .. jego po prostu byłem tam wcześniej. db4o musi obsługiwać wszystkie aspekty języka C# bez ograniczeń cokolwiek o Przegraj bitwę. –

+0

@ G.Y Widziałeś to pytanie w 2008 roku, prawda? –

Odpowiedz

1

Dobrze, że jest coś na serwerach db40, który nie pozwala na zbyt wielu klientów naraz, ponieważ jest zbyt wiele osób mogło z tym poradzić, a także zablokowałeś to, co nie pomogło w tym przypadku:

Powiązane problemy