2009-06-04 7 views
0

私の現在のサイトは、誰かが初めてアプリケーションにログインしたときに、特定の人々のためにメッセージを残すように設定されています。残されたメッセージの数は、1000から10000のいずれかであり、それぞれが照会であり、すべての照会はトランザクション・ステートメントである。背景ASP.NETでのスレッド化とパフォーマンスへの影響

はい、私はこれが貧しいデザインのように思えます。それは私の質問ではありません。

現在、ユーザーがログインすると、サーバーはユーザーが実際に何かを実行できるようにするには、すべてのクエリを完了する必要があります。つまり、タイムアウトが発生してページがリセットされるまで、ユーザーはログイン画面を表示します。最近、私たちは30分まで待ちました(!)

私はこのプロセスをスレッドに入れて、ユーザーがウェブサイトにログインして、必要な作業を行い、その作業を表示/削除できるようにしますメッセージ配信者によって妨げられることなくメッセージを送信します。

私の質問は、このプロセスを処理するために新しいスレッドを単に回転させて問題を解決します(つまり、配信者がメッセージを残している間に作業できるようにします)。また、同じサーバー上の他のWebアプリケーションに影響を与えるスレッドを停止しますか? KMのコメント

簡体スキーマに基づいて

EDIT:

タスクテーブル:

 
TaskID  StartDate   EndDate  PercentComplete 
TSK1   4/17/09   5/17/09  60 
TSK2   3/19/09   3/29/09  80 
TSK3   1/1/08   2/9/09  100 

割り当て表:

 
TaskID  ResourceID 
TSK1   111 
TSK1   222 
TSK2   222 
TSK2   333 
TSK2   444 
TSK3   111 
TSK3   333 

メッセージテーブルスキーマ:

 
Subject  Receiver  Sender  Content 
Overdue Task 111   000   Task TSK1 is overdue. 
Overdue Task 222   000   Task TSK1 is overdue. 
Overdue Task 222   000   Task TSK2 is overdue. 
Overdue Task 333   000   Task TSK2 is overdue. 
Overdue Task 444   000   Task TSK2 is overdue. 

このコードでは、すべての人が期限切れのタスクに割り当てられます。今日より早くEndDateし、!= 100%完了してください)、それらを伝えるメッセージを残してください

私は実際の問題は、メッセージを挿入する前にC#コードを使用してメッセージとトランザクションを構成します。

+0

メッセージをタスクに参加させる方法についての情報を提供 –

+0

メッセージはタスクに参加していません。私はタスクIDが必要なので、メッセージ本文に入れることができます。メッセージは、それらを読むメッセージであるため、メッセージに結合する必要があるリソースです。 –

答えて

1

は、これであなたのループを置き換える:

BEGIN TRANSACTION 

INSERT INTO Messages 
     (Subject, Receiver, Sender, Content) 
    SELECT 
     'Overdue Task', t.TaskID, '000', 'Task '+CONVERT(varchar,t.TaskID)+' is overdue.' 
     FROM Tasks     t 
      INNER JOIN Assignments a ON t.TaskID=a.TaskID 
      LEFT OUTER JOIN Messages m ON t.TaskID=m.Receiver 
     WHERE t.EndDate<GETDATE() AND PercentComplete<100 
      AND m.Receiver IS NULL 

DELETE Messages 
    FROM Messages 
     INNER JOIN Tasks ON Messages.Receiver=Tasks.TaskID AND PercentComplete=100 

COMMIT 

これはのみ行われていないと、既に持っているメッセージを持っていないため、作業上のために挿入されます。完了したタスクからメッセージが削除されます。あなたが選択したエラー処理を追加する必要があります。

EDIT
タスクにメッセージを参加できないため、あなたは私が上記の持っているように、削除を行うことができないことができます。 EndDate列に時間がない場合は、真夜中の直後にこれをSQL Serverジョブとして実行できます。そのジョブの一部として、最初にテーブルを切り捨て、必要なものを挿入します。タスクが100の完了とマークされたときにメッセージを削除するようにします。

+0

男これはとても近いです!しかし、MessagesテーブルのReceiverフィールドは、タスクIDではなくリソースIDであることを意図しています。 私は必要なものにInsertステートメントを修正しましたが、Deleteステートメント –

3

作業をバックグラウンドスレッドに委任できます。仕事をする関数を作成し、それが好きで起動します。

new Thread(
    () => SendALotOfMessagesByBadDesign(par1) 
    ).Start(); 

は、IISを再起動するか、アプリケーションプールをリサイクルすると、バックグラウンドスレッドを中断し、それはあまりにもあなたの現在のソリューションで起こるでしょう。

+0

+1を修正する方法を見つけることができません。なぜなら、IISワーカープロセスはいつでも終了し、バックグラウンドスレッドの作業が失われるからです。 – Greg

0

また、同じサーバー上の他のウェブ アプリケーションに影響を与えるスレッドから スピンしていませんか?

Webサーバーに複数のCPUがあると仮定すると、このWebアプリケーションを独自のアプリケーションプールに割り当て、特定のプロセッサに親和性を設定して他のWebアプリケーションへの影響を制限できると思います。 http://www.iis.net/ConfigReference/system.applicationHost/applicationPools/add/cpu

私は決してこれをやったことはありません、私はただ「可能性の領域内」としてそこに投げかけています。私はそれが賢明かどうかわからない。

関連する問題