Мы оцениваем 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);
}
}
}