Wir testen eine Anwendung, die Echtzeitdaten für mehrere Benutzer auf einer Sekunde anzeigen soll. Neue Daten von 128 Zeilen werden jede Sekunde von der Server-Anwendung in eine SQL-Datenbank eingefügt, dann müssen sie von allen Benutzern zusammen mit einer anderen alten 128-fachen Zeile abgefragt werden.Abfragen von Echtzeitdaten aus einer SQL-Datenbank Problem mit plötzlicher Latenz
Wir haben die Abfragezeit getestet und es nicht 30 Millisekunden überschritten; auch die Interface-Funktion, die die Abfrage aufruft, dauerte nicht mehr als 50 Millisekunden mit der Verarbeitung der Daten und alle
Wir entwickelten eine Test-Anwendung, die einen Thread und eine SQL-Verbindung für jeden Benutzer erstellt. Der Benutzer gibt 7 Abfragen alle 1 Sekunde aus. Alles beginnt gut und kein Benutzer benötigt mehr als 300 Millisekunden für die 7 Datenreihen (Abfragen). Nach 10 Minuten überschreitet die Latenz jedoch 1 Sekunde und steigt weiter an. Wir wissen nicht, ob das Problem darin besteht, dass der SQL Server 2008 mehrere Anfragen gleichzeitig bearbeitet und wie man ein solches Problem löst.
Hier ist unser Test-Client, wenn es helfen könnte. Beachten Sie, dass der Client und der Server auf derselben 8-CPU-Maschine mit 8 GB RAM ausgeführt werden. Jetzt stellen wir in Frage, ob die Datenbank nicht die optimale Lösung für uns ist.
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Enter Number of threads");
int threads = int.Parse(Console.ReadLine());
ArrayList l = new ArrayList();
for (int i = 0; i < threads; i++)
{
User u = new User();
Thread th = new Thread(u.Start);
th.IsBackground = true;
th.Start();
l.Add(u);
l.Add(th);
}
Thread.CurrentThread.Join();
GC.KeepAlive(l);
}
}
class User
{
BusinessServer client ; // the data base interface dll
public static int usernumber =0 ;
static TextWriter log;
public User()
{
client = new BusinessServer(); // creates an SQL connection in the constructor
Interlocked.Increment(ref usernumber);
}
public static void SetLog(int processnumber)
{
log = TextWriter.Synchronized(new StreamWriter(processnumber + ".txt"));
}
public void Start()
{
Dictionary<short, symbolStruct> companiesdic = client.getSymbolData();
short [] symbolids=companiesdic.Keys.ToArray();
Stopwatch sw = new Stopwatch();
while (true)
{
int current;
sw.Start();
current = client.getMaxCurrentBarTime();
for (int j = 0; j < 7; j++)
{
client.getValueAverage(dataType.mv, symbolids,
action.Add, actionType.Buy,
calculationType.type1,
weightType.freeFloatingShares, null, 10, current, functionBehaviour.difference); // this is the function that has the queries
}
sw.Stop();
Console.WriteLine(DateTime.Now.ToString("hh:mm:ss") + "\t" + sw.ElapsedMilliseconds);
if (sw.ElapsedMilliseconds > 1000)
{
Console.WriteLine("warning");
}
sw.Reset();
long diff = 0;//(1000 - sw.ElapsedMilliseconds);
long sleep = diff > 0 ? diff : 1000;
Thread.Sleep((int)sleep);
}
}
}
Woher wissen Sie, dass die Datenbank Sie verlangsamt? – JohnOpincar
Fügt GC zur Latenz hinzu? Jede Abfrage erstellt neue Objekte, die von GC gesammelt werden. –
John, was könnte sonst noch das Problem sein? Shashikant, Wir verwenden GC.keepalive (l), um zu verhindern, dass der Thread beendet wird, wenn der aufrufende Thread abstirbt. – mustafabar