Oceniamy db4o (OO-DBMS z http://www.db4o.com). Przygotowaliśmy test wydajności dla trybu klient/serwer, w którym uruchamiamy serwer, a następnie uruchamiamy go z kilkoma klientami jednocześnie. Wygląda na to, że serwer może przetwarzać tylko jedno zapytanie klienta na raz.Klient/serwer db4o wydaje się być w stanie przetworzyć tylko jedno zapytanie naraz?
Czy przegapiliśmy przełącznik konfiguracji, który pozwala na taki scenariusz? Implementacja serwera znajduje się poniżej. Klient łączy, kwerendy (tylko do odczytu) i rozłącza na operację, a operacje uruchamiają jeden po drugim z kilku wątków roboczych w procesie klienta. Widzimy to samo zachowanie, jeśli rozpoczynamy jeden proces klienta z jednym pracownikiem na tym samym serwerze.
Wszelkie sugestie?
Edytuj: Znaleźliśmy i wypróbowaliśmy Lazy i Snapshot QueryModes, i choć zmniejsza to problem serwera blokującego (częściowo), nadal widzimy znaczące problemy z współbieżnością, gdy nasi klienci (prowadzimy 40 równoległych testów) klienci, którzy czekają 1-300 ms przed wydaniem losowego żądania operacji) młotkiem na serwerze. Nie wydaje się być wyjątki pochodzące od dostawcy LINQ oraz z wewnętrznych 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);
}
}
}
Odwiedź fora db4o, abyśmy mogli znaleźć rozwiązanie .. – Goran
Marnujesz kolesia .. załóżmy, że wszystko będzie działało na najwyższym poziomie 100 % ... czy twoja ocena zakończy się rozwiązaniem SQL i struktury encji na korzyść db4o? naprawdę przykro mi być denerwującym .. jego po prostu byłem tam wcześniej. db4o musi obsługiwać wszystkie aspekty języka C# bez ograniczeń cokolwiek o Przegraj bitwę. –
@ G.Y Widziałeś to pytanie w 2008 roku, prawda? –