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

Posted

技术标签:

【中文标题】db4o 客户端/服务器似乎一次只能处理一个查询?【英文标题】:db4o client/server appears to only be able to process one query at a time? 【发布时间】:2008-10-22 16:56:59 【问题描述】:

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

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

有什么建议吗?

编辑:我们现在已经发现并试用了惰性和快照查询模式,虽然这缓解了阻塞服务器问题(部分),但当我们的客户端(我们运行 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 论坛,以便我们制定解决方案。 你在浪费时间老兄.. 假设一切都会 100% 运行一流......您的评估是否会得出结论,解散 SQL 和实体框架以支持 db4o?真的很抱歉很烦人..只是我以前去过那里。 db4o 必须不受任何限制地支持 C# 语言的所有方面,否则将失败。 @G.Y 你看到这个问题是在 2008 年提出的,对吧? @PeterMounce 大声笑.. 为什么它显示在我的列表顶部?顺便说一句,你的结论是什么——我真的很好奇 :) @G.Y 我们当时得出的结论是,我们没有得到报酬来编写数据库服务器,我认为最终恢复使用带有 ORM 的关系数据库。该项目是短暂的。 【参考方案1】:

嗯,db40 服务器上有些东西不允许同时打开太多客户端,因为它对某些人来说太多了,无法处理。您还锁定了它,在这种情况下没有任何帮助。

【讨论】:

以上是关于db4o 客户端/服务器似乎一次只能处理一个查询?的主要内容,如果未能解决你的问题,请参考以下文章

如何提高 db4o 中的查询速度?

关于db4o的透明激活与激活声明

db4o - 线程安全、嵌入式服务器、事务...一般问题

Db4o ObjectContainer工厂

Web服务器实现文件传输程序设计

db4o这个对象数据库有很多优点,但为什么不是很火? 大家有没有用过db4o的?