문제

일부 정보를 트랜잭션 데이터베이스에 로그인 해야하는 간단한 ASMX 웹 서비스가 있습니다. 그러나 클라이언트를위한시기입니다. 데이터베이스를 업데이트하려는 호출은 저장 프로 시저 1 개만 호출되며 더 나은 성능을 위해 더 많은 최적화 될 수 있다고 믿지 않습니다. log4net을 사용하여 실행을 기록한 다음 데이터베이스를 업데이트하는 별도의 프로세스로 로그인을 읽도록 축소되었습니다.

더 좋은 방법이 있는지 궁금합니다. 내 코드가 다음과 같은 일을하게하는 방법이 있는지 궁금합니다.

public bool method(...)
{
  LogRun(...)

  Asynchronously call method to insert transaction

  return true;  
}
도움이 되었습니까?

해결책

편집하다: 나는 배경 노동자에 대해 틀렸다. 그래서 나는 그것을 스레드 버전으로 묶고 테스트했습니다.

작업을 비동기 적으로 수행하려면 다른 스레드를 시작하는 방법을 연구 할 수 있습니다.

public class Service1 : System.Web.Services.WebService
{

    [WebMethod]
    public void Log(int foo, int bar)
    {
        Thread a = new Thread(new ThreadStart(delegate()
        {
            // Do some processing here
            // For example, let it sleep for 10 secs
            Thread.Sleep(10000);
        }));
        a.Start();
    }
}

로그 메서드가 처리를 완료하는 데 10 초가 걸립니다. 그러나 실 a, 로그 메소드는 통화 직후에 반환됩니다.

또한이 스타일의 비동기 호출을 통해 삽입 작업이 완료되었는지 여부에 따라 호출 클라이언트를 보장 할 수있는 쉬운 방법이 없습니다.

다른 팁

당신이 시도하고 싶은 한 가지는입니다 트레이싱.

쿼리를 더 이상 최적화 할 수없는 경우 SQL 클라이언트의 시간 초과 값 SQL Server를 사용할 수 있다고 가정합니다.

웹 서비스를 소비하는 클라이언트 측에서 클라이언트가 다른 작업을 계속 수행하려면 해당 메소드를 비동기 적으로 사용할 수 있습니다. 웹 메소드가 완료되면 이벤트가 트리거됩니다. 멋진 작은 예가 있습니다 여기서 읽을 수 있습니다 도움이 될 수 있다고 생각한다면.

WebMethod 내에서 비동기 작업을 수행하는 것을 볼 수 있지만 ASP.NET 내부의 스레드 및/또는 스레드 풀로 작업 중이며 이미 다중 스레딩 작업이 재생됩니다. 기술적으로 실현 가능하지만 HTTPruntime이 서비스 요청을 제공하는 자원을 관리하므로 실수로 자원 시스템을 강탈 할 수도 있습니다.

로컬 LOG4NET 파일에 작성하고 오프라인 루틴에서 해당 데이터를 가져 오는 것은 SQL 서버가 오프라인 상태 일 수 있고 서비스를 계속 사용할 수 있으므로 실시간 로깅, 비동기 또는 다른 방법보다 높은 가용성입니다. 로깅 이외의 다른 것에 SQL Server가 필요하지 않은 경우 DB 작업을 웹 메드에서 유지하는 것이 좋습니다.

클라이언트를위한 화재 및 포 게트 호출 일 경우 웹 서비스는 큐에 세부 사항을 추가하고 클라이언트로 돌아갈 수 있습니다. MSMQ를 사용하여 설명하는 것과 유사한 것을 구현했습니다. 데이터베이스 타임 아웃을 수정하지는 않지만 클라이언트에서 오류 메시지를 제거합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top