2010-03-22 4 views
1

안녕하세요, xml 파일에 쓰는 데 문제가 있습니다. 브라우저를 통한 단일 요청에 대해서는 정상적으로 작동하지만, Charles와 같은 것을 사용하여 5-10 번의 반복 요청을 동시에 수행하면 여러 요청이 동시에 실패합니다. 추적 내용이 내부에 내용이없는 500 개의 오류를 보여주기 때문에 기본적으로 쓰기 액세스 또는 다른 작업을 기다리는 시간이 초과 된 것 같습니다. ....net을 사용하여 XML을 파일에 쓰는 데 문제가 있습니다. mvc - timeout?

이 방법은 저장소 클래스 내에 있으며 저장소 인스턴스를 싱글 톤이지만 아무런 차이가없는 것처럼 보입니다.

도움이 될만한 점이 많습니다. 환호

public void Add(Request request) { 
     try { 
      XDocument requests; 
      XmlReader xmlReader; 
      using (xmlReader = XmlReader.Create(_requestsFilePath)) { 
       requests = XDocument.Load(xmlReader); 
       XElement xmlRequest = new XElement("request", 
          new XElement("code", request.code), 
          new XElement("date", request.date), 
          new XElement("email", new XCData(request.email)), 
          new XElement("name", new XCData(request.name)), 
          new XElement("recieveOffers", request.recieveOffers) 
         ); 
       requests.Root.Element("requests").Add(xmlRequest); 
       xmlReader.Close(); 
      } 
      requests.Save(_requestsFilePath); 
     } catch (Exception ex) { 
      HttpContext.Current.Trace.Warn("Error writing to file: "+ex); 
     } 
    } 

답변

0

디자인에 몇 가지 문제가 있습니다. 첫째, 동시 작업과 관련된 컨텍스트에서 동일한 소스에서 동시에 읽을 수는 있지만 쓰기가 발생하면 다른 모든 읽기 및 쓰기 작업을 중지해야합니다. 그렇지 않으면 경쟁 조건이 발생합니다.

변경해야 할 첫 번째 일은 캐치 큰 Exception을 제거하는 것이 전체 오류를 볼 수 없기 때문입니다. 동일한 데이터를 5-10 번로드하는 동안 RAM을 모자이크했기 때문에 문제는 메모리 부족 오류 일 수 있습니다. 오류가 무엇인지 알지 못하면 올바르게 처리 할 수 ​​없을 것이며 추측이 도움이되지 않습니다.

스택 오버플로가 중단되면 중단하고 내 대답을 여기에 붙여 넣습니다.

+0

잘 스택 오버플로 내 대답을 게시하게하지 않을 이유를 모르겠다. 내 게시물의 최종 결과는 예외를 제거하고 실제 오류를 얻거나이 코드를 더 잘 만들 수있는 1000 가지 방법이 필요하다는 것이었지만 실제 문제가 무엇인지 모른 채 모두 장님이었습니다. –

+0

안녕하세요, 덕분에, iis7 실제로 처음으로, 그래서 이제 iis7 대신 casini를 사용하여 연결된 오류를 캡처하지 못했습니다 실현했습니다. 그래서 실제 오류입니다 - 프로세스가 다른 프로세스에서 사용 중이기 때문에 '... \ requests.xml'파일에 액세스 할 수 없습니다. 동일한 문제가있는 잠금 코드 (내부에서 코드 저장)를 사용하려고했습니다. 이러한 종류의 동시 파일 액세스에 유용한 코드 디자인 팁이 있습니까? 다른 답변 (뮤텍스 등)을 조사했지만이 문제를 해결할 수 없었습니다. – Mark

+0

한 번에 하나의 스레드 만 실제 파일에 액세스하도록하는 메커니즘이 필요합니다. 내 제안은이 파일을 메모리에로드하는 것입니다. 하루 종일 많은 요청이나 몇 초 후에 메모리에서 동시 변경을 수행하여 데이터를 디스크에 다시 보관할 수 있습니다. 더 자주 디스크 쓰기를해야한다면, 이런 종류의 설정으로 쉽게 수정할 수 있습니다. 절대적으로 메모리에 보관할 수 없다면, 저장소에서이 메소드를 호출 할 때 "쓰기 대기열"을 작성하고 항목을 추가 한 다음 선택할 때마다 전체 대기열을 작성하십시오. –

관련 문제