C# db4o客户机/服务器一次似乎只能处理一个查询?

C# db4o客户机/服务器一次似乎只能处理一个查询?,c#,multithreading,concurrency,client-server,db4o,C#,Multithreading,Concurrency,Client Server,Db4o,我们正在评估db4o(一个来自的OO-DBMS)。我们已经为客户机/服务器模式进行了一次性能测试,在测试中,我们先启动一台服务器,然后同时使用多个客户机进行测试。似乎服务器一次只能处理一个客户端的查询 我们是否错过了允许这种情况的配置切换?服务器实现如下所示。客户机对每个操作进行连接、查询(只读)和断开连接,并且操作从客户机进程中的几个工作线程一个接一个地运行。如果我们在同一台服务器上启动一个客户端进程,每个进程都有一个工作进程,我们会看到相同的行为 有什么建议吗 编辑:我们现在已经发现并尝试了

我们正在评估db4o(一个来自的OO-DBMS)。我们已经为客户机/服务器模式进行了一次性能测试,在测试中,我们先启动一台服务器,然后同时使用多个客户机进行测试。似乎服务器一次只能处理一个客户端的查询

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

有什么建议吗

编辑:我们现在已经发现并尝试了惰性和快照查询模式,虽然这部分缓解了阻塞服务器的问题,但当我们的客户端(我们运行40个并发测试客户端,在发出随机操作请求之前等待1-300ms)在服务器上运行时,我们仍然会看到严重的并发问题。LINQ提供程序和IO内部似乎存在异常:-(

公共类Db4oServer:ServerConfiguration,IMessageRecipient
{
私人停车场;
#区域IMessageRecipient成员
public void ProcessMessage(IMessageContext con,对象消息)
{
if(消息是StopDb4oServer)
{
Close();
}
}
#端区
公共静态void Main(字符串[]args)
{
//吞食;
新建Db4oServer().Run(true,true);
}
公共无效运行(bool shouldIndex、bool shouldloptimizenativequerys)
{
锁(这个)
{
var cfg=Db4oFactory.NewConfiguration();
if(shouldIndex)
{
对象类(类型(序列))
.ObjectField(“k__BackingField”)
.索引(真);
对象类(typeof(Vlip))
.ObjectField(“k__BackingField”)
.索引(真);
}
if(shouldOptimizationQueries)
{
cfg.OptimizeNativeQueries(true);
}
var server=db4ofacory.OpenServer(cfg,文件,端口);
GrantAccess(“0”,“kieran”);
GrantAccess服务器(“1”,“kieran”);
GrantAccess服务器(“2”,“kieran”);
GrantAccess服务器(“3”,“kieran”);
//server.Ext().Configure().ClientServer().SingleThreadedClient(false);
server.Ext().Configure().MessageLevel(3);
server.Ext().Configure().Diagnostic().AddListener(新的DiagnosticConsole());
server.Ext().Configure().ClientServer().SetMessageRecipient(此);
尝试
{
如果(!停止)
{
监视器。等等(这个);
}
}
捕获(例外e)
{
Console.WriteLine(如ToString());
}
server.Close();
}
}
公众假期结束()
{
锁(这个)
{
停止=真;
Monitor.Pulsell(本);
}
}
}

好吧,db40服务器上有一个问题,一次不允许有太多的客户端,因为这对某些人来说太难处理。你还锁定了它,这在这种情况下没有任何帮助。

请访问db4o论坛,以便我们能找到解决方案。你在浪费时间。假设一切都能达到100%的最高水平……是你的e评估将结束解散SQL和实体框架以支持db4o?真的很抱歉让人恼火。只是我以前去过那里。db4o必须支持C语言的所有方面,没有任何限制,否则将输掉这场战斗。@G.Y你看到这个问题是在2008年提出的,对吗?@Petermonce lol。为什么它会出现在我的问题之上列表?顺便问一句,你的结论是什么?我真的很好奇:)@G.Y我们当时得出结论,我们没有钱去写数据库服务器,我想最终还是使用了关系数据库,上面有一个ORM。这个项目是短暂的。
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);
        }
    }
}