2009-06-04 8 views
0

내 현재 사이트는 처음으로 누군가가 응용 프로그램에 로그인 할 때 특정 사람들에게 메시지를 남기도록 설정됩니다. 남은 메시지 수는 1000에서 10000 사이이며, 각각은 쿼리가되고 트랜잭션 문에서는 모든 쿼리가 될 수 있습니다.ASP.NET에서의 스레딩 및 성능에 미치는 영향

예, 이것이 제 질문이 아닌 가난한 디자인처럼 보입니다.

현재 사용자가 로그인하면 서버는 사용자가 실제로 어떤 작업을 수행하기 전에 모든 쿼리를 완료해야합니다. 내 말은 사용자가 타임 아웃이 시작될 때까지 로그인 화면을보고 페이지를 다시 설정한다는 것입니다. 최근에 우리는 최대 30 분 동안 기다렸습니다. (!)

사용자가 웹 사이트에 로그인하여 작업을 수행하고 해당 작업을 보거나 삭제할 수 있도록 스레드에이 프로세스를 넣으 려합니다. 메시지 전달자에 의해 방해받지 않는 메시지.

제 질문은이 프로세스를 처리하기 위해 새 스레드를 돌리기 만하면됩니까 (예 : 전달자가 메시지를 남기는 동안 사용자가 작업 할 수 있도록 허용)? 또한 스레드를 회전 시켜도 동일한 서버의 다른 웹 응용 프로그램에 영향을 줍니까? KM의 의견

간체 스키마를 기반으로

편집 :

작업 테이블 :

 
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. 

따라서 코드는 모든 사람에게 지연된 작업 (예 : 오늘보다 끝난 날짜와! = 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 

이는 수행되지 않으며 이미 메시지가없는 때문에 작업 넘게 삽입합니다. 완료된 작업에서 메시지를 제거합니다. 원하는 오류 처리를 추가해야합니다.

편집
태스크에 메시지를 가입 할 수 있기 때문에, 당신은 내가 위의이 같은 삭제 할 수는 없습니다. EndDate 열에 시간이 없으면 자정 직후 SQL Server 작업으로이 작업을 실행할 수 있습니다. 해당 작업의 일부로 먼저 테이블을 자른 다음 필요한 것을 삽입하십시오. 작업이 완료 100으로 표시되면 메시지를 삭제했는지 확인하십시오.

+0

사람이 너무 가깝습니다! 그러나 Messages 테이블의 Receiver 필드는 Task ID가 아닌 Resource ID가됩니다. Insert 문을 필요한대로 고정했지만 IIS 작업자 프로세스가 언제든지 죽을 수 있고 백그라운드 스레드의 작업이 손실 될 수 있으므로 Delete 문을 수정하는 방법을 알아낼 수 없습니다. –

3

작업을 백그라운드 스레드에 위임 할 수 있습니다.일을 할 수있는 기능을 만들고 그것을 좋아 시작 :

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

IIS를 다시 시작하거나 백그라운드 스레드를 중단 할 응용 프로그램 풀을 재활용,하지만 너무 현재 솔루션에 발생합니다. 또한

+0

+1. – Greg

0

, 스레드에 미치는 영향 떨어져 동일한 서버에 다른 웹 응용 프로그램을 회전 하는가?

웹 서버에 여러 개의 CPU가 있다고 가정하면이 웹 응용 프로그램을 고유 한 응용 프로그램 풀에 할당하고 특정 웹 서버에 대한 선호도를 설정하여 다른 웹 응용 프로그램에 미치는 영향을 제한 할 수 있다고 가정합니다. http://www.iis.net/ConfigReference/system.applicationHost/applicationPools/add/cpu

나는 이것을 한 번도 해 본적이 없다. 나는 "가능성의 영역 내에서"그것을 단지 던지고있다. 나는 그것이 바람직한지 아닌지 모른다.

관련 문제