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

8
我们正在评估db4o(来自http://www.db4o.com的面向对象数据库管理系统)。我们已经为客户端/服务器模式制定了性能测试,其中我们首先启动服务器,然后同时用多个客户端进行测试。看起来服务器一次只能处理一个客户端的查询。
我们是否错过了允许此场景的某个配置开关?以下是服务器实现。客户端连接、查询(只读)和断开连接每次操作都会运行,操作从客户端进程中的多个工作线程立即运行。如果我们使用同一服务器对一个客户端进程每个工作线程进行旋转,我们会看到相同的行为。
有什么建议吗?
编辑:我们现在已经发现并尝试了懒惰和快照查询模式,虽然这部分缓解了阻塞服务器问题,但当我们的客户端(我们运行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
你在浪费时间,伙计。假设一切都能完美运行100%……你的评估会得出废弃SQL和实体框架,转而支持db4o的结论吗?真的很抱歉打扰你,只是我之前也有过这样的经历。db4o必须无限制地支持C#语言的所有方面,否则就会失败。 - G.Y
@G.Y,你看到这个问题是在2008年提出的,对吧? - Peter Mounce
@PeterMounce 哈哈.. 为什么它会显示在我的列表顶部?顺便问一下,你的结论是什么 - 我真的很好奇 :) - G.Y
1
@G.Y 我们当时得出的结论是,我们没有被聘请来编写数据库服务器,最终我们使用了一个带有ORM的关系型数据库。这个项目很短暂。 - Peter Mounce
1个回答

1

嗯,db40服务器上有些东西不能同时让太多客户端登录,因为这对某些人来说太过于繁重。你还锁定了它,这在这种情况下没有任何帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接