DB4O 客户机/服务器似乎一次只能处理一个查询

本文关键字:处理 查询 一个 一次 客户机 服务器 DB4O | 更新日期: 2023-09-27 17:47:21

我们正在评估db4o(来自 http://www.db4o.com 的OO-DBMS)。 我们已经为客户端/服务器模式进行了性能测试,在该模式下,我们启动服务器,然后同时与多个客户端进行锤击。 似乎服务器一次只能处理一个客户端的查询。

我们是否错过了允许这种情况的配置开关? 服务器实现如下。 客户端按操作连接、查询(只读)和断开连接,操作从客户端进程中的多个工作线程一个接一个地运行。 如果我们针对同一服务器启动一个客户端进程,每个进程都有一个工作线程,我们会看到相同的行为。

有什么建议吗?

编辑:我们现在已经发现并尝试了 Lazy 和 Snapshot QueryModes,虽然这缓解了阻塞服务器问题(部分),但当我们的客户端(我们运行 40 个并发测试客户端,在发出随机操作请求之前等待 1-300 毫秒)锤击时,我们仍然会看到明显的并发问题。 似乎存在来自 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);
        }
    }
}

DB4O 客户机/服务器似乎一次只能处理一个查询

好吧,db40 服务器上有一些东西不允许一次打开太多客户端,因为对于某些客户端来说太多了。您还锁定了它,在这种情况下没有任何帮助。