2011-11-23 2 views
1

현재 C#을 사용하여 작성된 WinForms 응용 프로그램이 있습니다.C# - 일괄 저장 프로 시저 실행

모든 업데이트는 저장 프로 시저 실행을 통해 수행됩니다. 한 화면에 해당 화면에서 최대 60 개의 업데이트가있는 상황이 있습니다. 현재 각 업데이트 호출은 하나씩 처리되며 클라이언트와 서버 간의 연결 속도가 느린 일부 클라이언트는 속도 문제를 겪고 있습니다. 나는이 모든 호출을 데이터베이스에 즉시 보낼 수 있다면 클라이언트 측에서 많은 대기 시간을 절약 할 수 있다고 확신한다. (현재 60 개의 호출마다 ExecuteNonQuery가 호출되고 클라이언트는 계속하기 전에 참/거짓 결과가 나오고 지연이 발생 함).

이러한 모든 호출을 하나의 SQL 호출로 묶는 가장 좋은 방법은 무엇입니까? 모든 코드를 트랜잭션에 넣을 생각 이었지만 가능한 한 많은 수의 동시 사용자가 시스템을 사용하기 때문에 잠금을 최대한 피할 필요가 있습니다.

EDIT : 저장된 procs의 목적은 글자 그대로 서버의 레코드를 업데이트하는 것입니다. 우리는 실행중인 저장된 procs로부터 어떤 응답도 요구하지 않는다. 본질적으로, 나는 아래 하나의 호출에 그렇게 할 수있는 가장 좋은 방법은

 public virtual bool Update(DataRow dataRow, Guid userId) 
    { 
     SqlCommand cm = null; 
     bool ret = true; 
     try 
     { 
      cm = Utilities.GetSqlUpdateCommand(dataRow, userId); 
      ExecuteNonQuery(cm);    
     } 
     catch (SqlException ex) 
     { 
      LogDataAccessBaseError(ex); 
      ret = false; 
      throw; 
     } 
     finally 
     { 
      if (cm != null) 
      { 
       cm.Dispose(); 
      } 
     } 

     return ret; 
    } 

답변

0

는 직접적인 해결책이 필요한 매개 변수 및 소요 새로운 저장 프로 시저를 구현하는 수 무엇인지 궁금 호출하는 코드의 무리를 묶음으로 처리 할 서버에서 필요한 모든 저장 프로 시저를 실행합니다.

완전히 클라이언트 측에서 사용하는 또 다른 방법은 트랜잭션을 사용하는 것입니다. 저장 프로 시저가 수행해야하는 작업에 대해 아무 것도 모르기 때문에 여기서 잠금을 피하는 방법을 알 수는 없습니다.

0

특정 순서로 전화를 걸어야합니까? 멀티 스레딩은 도움이 될 수 있습니다.

질문에 대한 최상의 대답은 프로세스의 각 단계에서 제어 할 수있는 정도에 따라 다릅니다. 이상적으로, 당신은 당신이 필요로하는 것을 모두 포함하는 하나의 거대한 데이터 덩어리를 반환하는 하나의 호출을 만들 것입니다. 저장 프로 시저에서 데이터를 반환 할 때 저장 프로시 저는 여러 select 문을 반환 할 수 있으며 반환 된 레코드 집합을 반복 할 수 있습니다. 따라서 하나의 저장 프로 시저가 잠재적으로 필요한 모든 것을 반환 할 수 있습니다. 어쩌면 쿼리가 필요한 매개 변수에 따라 하나의 저장된 proc 파일에 모든 것을 감쌀 수도 있지만 어쩌면 적어도 몇 가지 호출로 감쌀 수 있습니다.

+0

-

(그것은 문이 시작될 때 단지가 기본적으로 트랜잭션이 자동으로 열립니다, 그리고 문이 성공적으로 완료 될 때 최선을 다하고 있습니다 그리고, 사실, SQL의 모든 문은 어쨌든 트랜잭션 내에서 실행) 어떤 종류의 정확성이 필요하면 NO LOCK 쿼리 힌트는 잠금을 피할 수 있습니다. 당신이 돈을 다루고 있다면 나는 그 말을 잊어 버린다. 그러나 웹 페이지가 지난 24 시간 동안받은 조회수와 같은 것을 다루는 경우 2 % 정도 벗어나면 도움이 될 수 있습니다. –

0

반 싱크 절반 비동기 패턴이 도움이 될 수 있습니다. 기본적으로 모든 요청을 대기열에 넣은 다음 항목을 클라이언트가 추출합니다.

추상 개념은 http://www.cs.wustl.edu/~schmidt/PDF/PLoP-95.pdf을 참조하십시오.

0

SQL Server 2008 이상을 사용하고 있으며 저장 프로 시저 호출이 모두 동일합니까 (개별 매개 변수 제외)?

그렇다면 Table-Valued Parameter (ADO)을 사용하는 저장 프로 시저 버전을 만드는 방법을 살펴볼 수 있습니다. 이렇게하면 모든 행을 SQL 서버에 단일 테이블로 전달할 수 있습니다.


하지 않으면, 나는 GetSqlUpdateCommand 현재 저장 프로 시저의 이름을 가진 SqlCommand를 구성하고 적절한 매개 변수를 추가한다고 가정합니다.다른 방법은

으로 변경하여 기존 SqlCommand 개체를 허용 할 수 있습니다. 그런 다음 exec StoredProcedure @Parm1,@Parm2,@Parm2이라는 새 호출을 추가하고 해당 매개 변수를 추가합니다. 추가 할 매개 변수에 새로운 이름을 사용하여 다른 exec 호출과 충돌하지 않도록해야합니다. 전달할 수있는 매개 변수 수의 한계에 근접했을 때이를 감지 할 수 있도록이 기능을 조정해야 할 수도 있습니다.이 매개 변수는이 명령을 실행 한 다음 새로운 명령을 작성해야합니다.

예. - 그들은 적은 오버 헤드/왕복으로 실행할 수 있도록 그들이 마술 함께 여러 통화를 결합하지 않는

exec MegaProcedure @Parm1,@Parm2,@Parm3 
exec MegaProcedure @Parm4,@Parm5,@Parm6 
exec MegaProcedure @Parm7,@Parm8,@Parm9 
마지막으로

, 당신이 거래/않는다 무엇인지 이해하지 못하는 생각 : 그것은 같은 텍스트 명령을 구축 타임스. 그것들은 순전히 간단하게 작업을 롤백 할 수있는 메커니즘이므로 여기서는 도움이되지 않습니다. 따라서