2008-10-22 66 views
8

我們正在評估db4o(來自http://www.db4o.com的OO-DBMS)。我們爲客戶端/服務器模式進行了性能測試,在這裏我們啓動服務器,然後同時與幾個客戶端進行連接。看起來服務器一次只能處理一個客戶端的查詢。db4o客戶機/服務器似乎一次只能處理一個查詢?

我們是否錯過了允許此場景的配置開關?服務器實現如下。客戶端連接,查詢(只讀)和每個操作的斷開連接,並且操作在客戶端進程中的多個工作線程中緊接着另一個運行。我們看到同樣的行爲,如果我們將一個客戶端進程與每個服務器的每個客戶端進程相對應一個服務器。

有什麼建議嗎?我們現在已經發現並嘗試了Lazy和Snapshot QueryModes,雖然這緩解了部分阻塞服務器問題,但是當我們的客戶端(我們運行40個併發測試用例)時,我們仍然發現了重要的併發問題,在發出隨機操作請求之前等待1-300ms的客戶端)在服務器上錘擊。似乎有從LINQ提供程序,並從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

請訪問db4o論壇,這樣我們就可以找出解決方案 – Goran 2008-10-23 13:08:46

回答

1

好,也有一些是在DB40服務器上不允許有太多的客戶在同一時間,因爲實在是太對於某些人來說很多,你也可以鎖定它,在這種情況下沒有任何幫助

相關問題