複数のユーザーのリアルタイムデータを1秒単位で表示するアプリケーションをテストしています。 128行の新しいデータがサーバーアプリケーションによってSQLデータベースに1秒ごとに挿入され、次に、すべてのユーザーによって別の古い参照128行とともに照会される必要があります。SQLデータベースからのリアルタイムデータの問い合わせ突然の待ち時間の問題
クエリ時間をテストしましたが、30ミリ秒を超えませんでした。また、クエリを呼び出すインターフェイス関数がデータを処理するのに50ミリ秒以上かかることはありません。
各ユーザーごとにスレッドとSQL接続を作成するテストアプリケーションを開発しました。ユーザーは1秒ごとに7つのクエリを発行します。すべてがうまく始まり、ユーザーは7つのデータシリーズ(クエリ)に対して300ミリ秒以上かかることはありません。ただし、10分後にはレイテンシは1秒を超えて増加し続けます。問題が複数の要求を同時に処理するSQL Server 2008であるかどうか、そのような問題を解決する方法はわかりません。
テストクライアントが役立つ場合は、ここをクリックしてください。クライアントとサーバーは8GBのRAMを備えた同じ8台のCPUマシン上に作成されています。現在、データベースが最適なソリューションではないかどうかを疑問視しています。
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);
}
}
}
データベースが減速していることをどのように知っていますか? – JohnOpincar
GCがレイテンシに追加されていますか?すべてのクエリは、GCによって収集される新しいオブジェクトを作成しています。 –
John、他に何が問題になる可能性がありますか? Shashikant、GC.keepalive(l)を使用して、呼び出しスレッドが終了したときにスレッドが終了しないようにします。 – mustafabar