клиент/сервер db4o, кажется, только может обработать один запрос за один раз?

Мы оцениваем db4o (OO-DBMS из http://www.db4o.com). Мы соединили тест производительности для клиент-серверного режима, где мы вращаем сервер, затем куем его с несколькими клиентами сразу. Кажется, что сервер может только обработать запрос одного клиента за один раз.

Мы пропустили переключатель конфигурации где-нибудь, который допускает этот сценарий? Реализация сервера ниже. Клиент соединяет, запрашивает (только для чтения), и разъединяется на операцию, и операции сразу выполняют тот после другого от нескольких рабочих потоков в клиентском процессе. Мы видим то же поведение, если мы вращаем один клиентский процесс с одним рабочим каждый против того же сервера.

Какие-либо предложения?

Править: Мы теперь обнаружили и испытали, Ленивое и Снимок 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("k__BackingField")
                               .Indexed(true);
                cfg.ObjectClass(typeof (Vlip))
                               .ObjectField("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);
        }
    }
}

8
задан Yuck 22 August 2011 в 14:14
поделиться