2011-04-14 2 views
0

먼저 데이터를 삽입하는 데 사용하는 두 가지 방법과 삽입 된 데이터의 현재 개수를 가져 오는 두 가지 방법이 있습니다. 둘 다 WCF 서비스 메서드입니다. 데이터베이스에 대량 레코드를 삽입해야하므로 병렬로 삽입 된 레코드 수를 확인하고 싶습니다. 그 때문에 나는 두 번째 방법을 사용하고 있습니다.WCF의 메서드 응답 문제

그러나 불행히도 첫 번째 프로세스가 응답을 제공하지 않는 한 응답을 제공하지 않습니다. 두 방법을 독립적으로 실행하려고합니다. Ajax 지원 WCF 서비스를 사용하고 있습니다. 문제를 추적 할 수 없으므로 도와주세요.

감사합니다.

+0

테이블 잠금 장치를 확인 했습니까? 이것이 WCF 문제라고 생각하지 않습니다. –

+0

이것이 WCF 문제가 아닌 것 같습니다. 어떤 방법으로 대량 레코드를 삽입 하시겠습니까? 어떻게 계산 되니? – BrandonZeider

+0

@Gerrie Schenck : 데이터베이스 테이블의 잠금을 수동으로 해제합니다. – Anvesh

답변

1

SQL Server에서 이것을 호출하고 있습니까?

일괄 업데이트를 별도의 스레드에서 실행하고 대기열에 넣었고 처리 중임을 신속하게 되돌려 보내지 않는 이유는 무엇입니까?

너무 많은 데이터베이스 연결을 사용하지 못하도록 방지하기 위해 데이터를 대기열에 넣었으며 10 초마다 대기열에있는 데이터를 처리합니다.

그러면 두 번째 기능이 상태를 확인할 수 있습니다.

UPDATE :

나는 처리를 수행하는 정적 클래스가 있고, 코드는 끝입니다. 기본적으로 호출이 들어오고 즉시 대기열에 넣었습니다. 대기열은 백그라운드에서 실행되며 10 초마다 점검하고 거기에있는 모든 것을 처리합니다.

나는 내 큐에 ConcurrentQueue을 사용하므로 동시에 쓰고 처리 할 수 ​​있습니다.

그래서 이것을 사용하여 업데이트를 시작한 다음 다른 통화에서 처리 된 통화 수를 확인하고 해당 정보를 돌려받을 수 있습니다. 각 대량 삽입에 대한 조작 키를 생성 할 수 있습니다, 첫 번째가 완료 될 때까지

public static Jobs[] JobQueue 
    { 
     set 
     { 
      try 
      { 
       value.AsParallel().ForAll(i => jobqueue.Enqueue(i)); 
      } 
      catch (Exception e) 
      { 
       writeToLog("..\r\n" + e.Message + "\r\n" + e.StackTrace); 
      } 
     } 
    } 

    public static void ProcessUpdateJobQueue() 
    { 
     Action UpdateJob =() => 
     { 
      if (jobqueue.IsEmpty) 
       return; 
      Parallel.For(0, jobqueue.Count, new ParallelOptions() { MaxDegreeOfParallelism = 1 }, 
       (j) => 
       { 
        // Do updates here 
       }); 
     }; 
     if (processUpdateJobThread == null) 
     { 
      processUpdateJobThread = new System.Threading.Thread(() => 
      { 
       while (true) 
       { 
        UpdateJob(); 
        System.Threading.Thread.Sleep(10000); 
       } 
      }); 
      processUpdateJobThread.Start(); 
     } 
    } 
+0

대답을 자세히 설명해 주시겠습니까 ?? – Anvesh

+0

답장을 보내 주셔서 감사합니다. 그것은 좋은 해결책이지만 내 문제는 지금 해결됩니다. 나는 방법을 바꾸기 위해 길을 바꾸었다. – Anvesh

0

두 번째 작업을 마칠 수 없습니다, 두 번째 작업을 사용할 수 있습니다

public string[] UpdateJobs(Jobs[] jobs) 
    { 
     WebServiceControllerStatic.JobQueue = jobs; 
     WebServiceControllerStatic.ProcessUpdateJobQueue(); 
     List<String> s = new List<String>(); 
     for (int t = 0; t < jobs.Length; t++) 
     { 
      s.Add("Success"); 
     } 
     return s.ToArray(); 
    } 

은 WebServiceControllerStatic 클래스에 삽입 된 레코드 수를 얻으려면 해당 키를 누르십시오.

계약은 다음과 같이한다 : 당신의 삽입 작업이 단일 트랜잭션에서 일을이야 않는 경우

Guild DoBulkInsert(string commands); 

int? GetCount(Guid bulkId); 
2

, 다음 다른 작업이 트랜잭션이 완료 전까지 새로운 기록을 볼 수 없습니다.

결과가 100 % 정확하고 안정적이지 않은 경우에는 read uncomitted 격리 수준에서 선택 (초) 연산을 실행하도록 선택할 수 있습니다.

이 경우 허용되지 않는 경우 별도의 트랜잭션 (중첩 된 트랜잭션 범위가 아닌) 인 의 몇 가지 행마다 다른 테이블로 진행률을 쓸 수 있으므로 선택 작업에서 읽을 수 있습니다.

0

@Menahem 대답에 +1.

또한 하나씩 삽입하는 대신 SqlBulkCopy을 사용해야합니다. 내 경험으로 볼 때 성능이 크게 향상 될 것입니다.

+0

그래,하지만 외래 키로 참조되는 두 개의 서로 다른 테이블에 레코드를 삽입해야한다는 것을 알고있다. – Anvesh